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.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
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 CF_277B {

    static boolean check(int I, int J, boolean[][] M){
        boolean bad = false;
        for(int i=0; i<M[0].length; i++){
            if(!M[I][i]){
                bad = true;
                break;
            }
        }
        for(int i=0; i<M.length; i++){
            if(!M[i][J]){
                bad = true;
                break;
            }
        }
        return !bad;
    }

    public static void main(String[] args) {
        FastScanner sc = new FastScanner(System.in);        
        PrintWriter out = new PrintWriter(System.out);

        int n = sc.nextInt();
        int m = sc.nextInt();
        boolean[][] B = new boolean[n][m];

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                int act = sc.nextInt();
                if(act==1){
                    B[i][j] = true;
                }
            }
        }

        boolean[][] A = new boolean[n][m];

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(check(i,j,B)){
                    A[i][j] = true;
                }
            }
        }

        boolean[][] X = new boolean[n][m];

        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){         

                for(int J=0; J<m;J++){
                    X[i][j]|=A[i][J];
                }
                
                for(int I =0; I<n; I++){
                    X[i][j]|=A[I][j];
                }

            }
        }

        boolean dif = false;

        for(int i=0; i<n; i++) {
            for(int j=0; j<m; j++){
                if(B[i][j]!=X[i][j]){
                    dif = true;
                    break;
                }
            }
        }

        if(dif)
            out.println("NO");
        else {
            out.println("YES");
            for(int j=0; j<n; j++){
                if(A[j][0])
                    out.print(1);
                else
                    out.print(0);
                for(int i=1; i<m; i++){
                    out.print(" ");
                    if(A[j][i])
                        out.print(1);
                    else
                        out.print(0);
                }
                out.println();
            }
        }

        out.flush();
        out.close();

    }



    static class FastScanner {
        BufferedReader br;
        StringTokenizer st;

        public FastScanner(File f) {
            try {
                br = new BufferedReader(new FileReader(f));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        public FastScanner(InputStream f) {
            br = new BufferedReader(new InputStreamReader(f));
        }

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

        boolean hasMoreTokens() {
            while (st == null || !st.hasMoreTokens()) {
                String s = null;
                try {
                    s = br.readLine();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (s == null)
                    return false;
                st = new StringTokenizer(s);
            }
            return true;
        }

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

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

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

}