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:
import java.io.*;
import java.util.*;

public class ORinMatrix {
	public static void main(String args[]){
		FScanner in = new FScanner();
		PrintWriter out = new PrintWriter(System.out);
		int m=in.nextInt(),n=in.nextInt();
		int arr[][]=new int[m][n];
		int check_row[]=new int[m];
		int check_col[]=new int[n];
		int c=0,count1=0,ans=0;
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
				 { arr[i][j]=in.nextInt();
				 	if(arr[i][j]==1)
				 	count1++;
				 }
		}
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				int f=0,f1=0;
				if(arr[i][j]==1)
				{
					if(check_row[i]!=-1&&j==0)
					for(int k=j+1;k<n;k++)
					{
						if(arr[i][k]==0)
							{check_row[i]=-1;f=1;break;}
					}
					if(f==0&&check_row[i]!=-1)
					{
						check_row[i]=1;
						
					}
					if(check_col[j]!=-1&&i==0)
					for(int k=j+1;k<m;k++)
					{
						if(arr[k][j]==0)
							{check_col[j]=-1;f1=1;break;}
					}
					if(f1==0&&check_col[j]!=-1)
						{ check_col[j]=1; }
					if(f==1&&f1==1)
						{ ans=-1;break;}
				}
				else
				{
					check_row[i]=-1;
					check_col[j]=-1;
					
				}
			}
			if(ans==-1)
				break;
		}
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(check_row[i]==1&&check_col[j]==1)
					c++;
				else if(check_row[i]==-1&&check_col[j]==-1&&arr[i][j]==1)
					ans=-1;
				
			}
		}
		if(count1!=0&&c==0||(ans==-1))
			out.println("NO");
		else{
			out.println("YES");
		for(int i=0;i<m;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(check_row[i]==1&&check_col[j]==1)
					out.print("1 ");
				else 
					out.print("0 ");
			}
			out.println();
		}
	}
	

		out.close();
	}

	static boolean checkprime(int n1)
	{
		if(n1%2==0||n1%3==0)
			return false;
		else 
		{
			for(int i=5;i*i<=n1;i+=6)
			{
				if(n1%i==0||n1%(i+2)==0)
					return false;
			}
			return true;
		}
	}
	
	static class FScanner {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer sb = new StringTokenizer("");

		String next(){
			while(!sb.hasMoreTokens()){
				try{
					sb = new StringTokenizer(br.readLine());
				} catch(IOException e){ }
			}
			return sb.nextToken();
		}
		String nextLine(){
			try{ return br.readLine(); } 
			catch(IOException e) { } return "";
		}

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

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

		int[] readArray(int n) {
			int a[] = new int[n];
			for(int i=0;i<n;i++) a[i] = nextInt();
			return a;
		}

		float nextFloat(){
		return Float.parseFloat(next());
		}
		
		double nextDouble(){
		return Double.parseDouble(next());
		}
	}
}