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 hashing;
import java.util.*;
import java.lang.*;
import java.io.*;
public class B_OR_in_Matrix {
static class FastReader {
	BufferedReader br;
	StringTokenizer st;

	public FastReader() {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	String next() {
		while (st == null || !st.hasMoreElements()) {
			try {
				st = new StringTokenizer(br.readLine());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return st.nextToken();
	}

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

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

	double nextDouble() {
		return Double.parseDouble(next());
	}

	String nextLine() {
		String str = "";
		try {
			str = br.readLine();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return str;
	}

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

static void ruffle_sort(int[] a) {
	//shandom_ruffle
	Random r = new Random();
	int n = a.length;
	for (int i = 0; i < n; i++) {
		int oi = r.nextInt(n);
		int temp = a[i];
		a[i] = a[oi];
		a[oi] = temp;
	}

	//sort
	Arrays.sort(a);
}

static int hcf(int a, int b) {
	if (b == 0)
		return a;
	return hcf(b, a % b);
}

static int pow(int a, int b) {
	int ans = 1;
	while (b > 0) {
		if ((b & 1) != 0)
			ans *= a;

		a = a * a;
		b = b >> 1;
	}
	return ans;
}

static void prime(List<Integer> prime, int n) {

	boolean arr[] = new boolean[n + 1];
	Arrays.fill(arr, true);
	arr[0] = arr[1] = false;
	for (int i = 2; i * i <= n; i++) {
		if (arr[i] == true) {
			//prime.add(i);
			for (int j = i * i; j < arr.length; j += i)
				arr[j] = false;
		}
	}
	for (int i = 0; i < arr.length; i++) {
		if (arr[i] == true)
			prime.add(i);
	}

}

public static void main(String[] args) throws java.lang.Exception {
	try {
		FastReader sc = new FastReader();
		PrintWriter out = new PrintWriter(System.out);
	
		
			int m = sc.nextInt();
			int n=sc.nextInt();
			int arr[][]= new int[m][n];
			for(int i=0;i<m;i++)
				for(int j=0;j<n;j++)
					arr[i][j]= sc.nextInt();
			
			int res[][]= new int[m][n];
			for(int i=0;i<m;i++)
				for(int j=0;j<n;j++)
					res[i][j]= 1;
			
			for(int i=0;i<m;i++)
				{
				for(int j=0;j<n;j++)
				{
				if(arr[i][j]==0)
				{
				zero(i,j,m,n,res,arr);
				}
				}
				}
			
			if(check(res,arr,m,n)==true)
			{
				System.out.println("YES");
			
			for(int i=0;i<m;i++)
			{		for(int j=0;j<n;j++)
			System.out.print(res[i][j]+" ");
			System.out.println();
		}
			}
			else
				System.out.println("NO");
			
		
		out.close();
	} catch (Exception e) {
	} finally {
		return;
	}
}

private static boolean check(int[][] res, int[][] arr,int m,int n) {
	
	
	//int c=0;
	for(int i=0;i<m;i++)
	{
		for(int j=0;j<n;j++)
		{ int or=0;
			for(int k=0;k<n;k++)
				or=or|res[i][k];
			
			for(int k=0;k<m;k++)
				or=or|res[k][j];
			if(or!=arr[i][j])
				{
				//System.out.println(c);
				return false;
				}
		}
	}
	
	return true;
}

private static void zero(int i, int j, int m, int n, int[][] res, int[][] arr) {
	for(int k=0;k<n;k++)
		res[i][k]=0;
	
	for(int k=0;k<m;k++)
		res[k][j]=0;
	
}

}