Problem: Let's define logical OR as an operation on two logical values (i. e. values that belong to the set {0, 1}) that is equal to 1 if either or both of the logical values is set to 1, otherwise it is 0. We can define logical OR of three or more logical values in the same manner:

<image> where <image> is equal to 1 if some ai = 1, otherwise it is equal to 0.

Nam has a matrix A consisting of m rows and n columns. The rows are numbered from 1 to m, columns are numbered from 1 to n. Element at row i (1 ≤ i ≤ m) and column j (1 ≤ j ≤ n) is denoted as Aij. All elements of A are either 0 or 1. From matrix A, Nam creates another matrix B of the same size using formula:

<image>.

(Bij is OR of all elements in row i and column j of matrix A)

Nam gives you matrix B and challenges you to guess matrix A. Although Nam is smart, he could probably make a mistake while calculating matrix B, since size of A can be large.

Input

The first line contains two integer m and n (1 ≤ m, n ≤ 100), number of rows and number of columns of matrices respectively.

The next m lines each contain n integers separated by spaces describing rows of matrix B (each element of B is either 0 or 1).

Output

In the first line, print "NO" if Nam has made a mistake when calculating B, otherwise print "YES". If the first line is "YES", then also print m rows consisting of n integers representing matrix A that can produce given matrix B. If there are several solutions print any one.

Examples

Input

2 2
1 0
0 0


Output

NO


Input

2 3
1 1 1
1 1 1


Output

YES
1 1 1
1 1 1


Input

2 3
0 1 0
1 1 1


Output

YES
0 0 0
0 1 0

Solution (in JAVA):

Solution:
//package CF;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.StringTokenizer;

public class B {

    public static void main(String[] args) throws Exception
    {
	Scanner bf = new Scanner(System.in);
	PrintWriter out = new PrintWriter(System.out);
	int n = bf.nextInt(), m = bf.nextInt();
	int [][] mat = new int[n][m];
	int[] r = new int[n];
	int[] c = new int[m];
	int sum = 0, sumR = 0, sumC = 0;
	for (int i = 0; i < n; i++)
	{
	    for (int j = 0; j < m; j++)
	    {
		mat[i][j] = bf.nextInt();
		r[i] += mat[i][j] == 0?1:0;
		c[j] += mat[i][j] == 0?1:0;
		sum += mat[i][j];
	    }
	}
	for (int i = 0; i < n; i++)
	{
	    sumR += (r[i] > 0?1:0);
	}
	for (int i = 0; i < m; i++)
	{
	    sumC += (c[i] > 0?1:0);
	}
	boolean flag = true;
	if(sum > 0 && (sumR == n || sumC == m))
	    flag = false;
	loop:
	    for (int i = 0; i < n && flag; i++)
	    {
		for (int j = 0; j < m; j++)
		{
		    if(mat[i][j] == 1 && (r[i] > 0 && c[j] > 0)){
			flag = false;
			break loop;
		    }
		}
	    }
	out.println(flag?"YES":"NO");
	if(flag){
	    for (int i = 0; i < n; i++)
	    {
		for (int j = 0; j < m; j++)
		{
		    if(r[i] == 0 && c[j] == 0)
			out.print(1 + " ");
		    else out.print(0 + " ");
		}
		out.println();
	    }
	}
	out.flush();
	out.close();
    }

    static class Scanner {
	StringTokenizer st;
	BufferedReader br;

	public Scanner(InputStream s)
	{
	    br = new BufferedReader(new InputStreamReader(s));
	}

	public Scanner(FileReader fileReader)
	{
	    br = new BufferedReader(fileReader);
	}

	public String next() throws IOException
	{
	    while (st == null || !st.hasMoreTokens())
		st = new StringTokenizer(br.readLine());
	    return st.nextToken();
	}

	public int nextInt() throws IOException
	{
	    return Integer.parseInt(next());
	}

	public long nextLong() throws IOException
	{
	    return Long.parseLong(next());
	}

	public String nextLine() throws IOException
	{
	    return br.readLine();
	}

	public boolean ready() throws IOException
	{
	    return br.ready();
	}
    }
}