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.util.*;
import java.lang.reflect.Array;
import java.math.*;
import java.io.*;
import java.awt.*;

public class Main{
    static FastReader in = new FastReader(new BufferedReader(new InputStreamReader(System.in)));
    static PrintWriter out = new PrintWriter(System.out);
    static final int maxn = (int)1e2 + 11;
    static int inf = (1<<30) - 1;
    static long n,m;
    static int a[][] = new int [maxn][maxn];
    static int b[][] = new int [maxn][maxn];
    static int c[][] = new int [maxn][maxn];
    static int dr[] = new int [maxn];
    static int dc[] = new int [maxn];
    
    
    public static void solve() throws Exception {
        n = in.nextLong();
        m = in.nextLong();
        
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                a[i][j] = in.nextInt();
            }
        }
        

        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                dr[i] += a[i][j];
            }
        }
        
        for (int i=1; i<=m; i++) {
            for (int j=1; j<=n; j++) {
                dc[i] += a[j][i];
            }
        }
        
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                if (dr[i]+dc[j]-1>=n+m-1) {
                    b[i][j] = 1;
                } else {
                    b[i][j] = 0;
                }
            }
        }
        
        Arrays.fill(dr, 0);
        Arrays.fill(dc, 0);
        
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                dr[i] += b[i][j];
            }
        }
        
        for (int i=1; i<=m; i++) {
            for (int j=1; j<=n; j++) {
                dc[i] += b[j][i];
            }
        }
        
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                if (dr[i]+dc[j]>0) {
                    c[i][j] = 1;
                } else {
                    c[i][j] = 0;
                }
            }
        }

        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                if (a[i][j]!=c[i][j]) {
                    out.println("NO");
                    return;
                }
            }
        }
        
        out.println("YES");
        for (int i=1; i<=n; i++) {
            for (int j=1; j<=m; j++) {
                out.print(b[i][j] + " ");
            }
            out.println();
        }
        
        
    }
    
    public static void main(String[] args) throws Exception {
        
        solve();
        out.close();
    }

    

}

class Pair implements Comparable<Pair> {
    int x,y;
    public Pair (int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    @Override
    public int compareTo(Pair p) {
        if (this.x<p.x) {
            return -1;
        } else if (this.x == p.x) {
            return 0;
        } else {
            return 1;
        }
    }
    
    
}

class FastReader {

    BufferedReader bf;
    StringTokenizer tk = null;
    String DELIM = " ";

    public FastReader(BufferedReader bf) {
        this.bf = bf;
    }

    public String nextToken() throws Exception {

        if(tk==null || !tk.hasMoreTokens()) {
            tk = new StringTokenizer(bf.readLine(),DELIM);
        }
        return tk.nextToken();
    }

    public int nextInt() throws Exception {
        return Integer.parseInt(nextToken());
    }

    public long nextLong() throws Exception {
        return Long.parseLong(nextToken());
    }

    public double nextDouble() throws Exception {
        return Double.parseDouble(nextToken());
    }
}