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 Test{
    public static boolean checkElement(boolean[][] b, int i, int j){
        if(!b[i][j])return false;
        if(i!=0&&!b[i-1][j])return false;
        if(j!=0&&!b[i][j-1])return false;
        if(j!=b[0].length-1&&!b[i][j+1])return false;
        if(i!=b.length-1&&!b[i+1][j])return false;
        return true;
    }
    
    public static boolean checkRow(boolean[][] b, int row){
        for(int j=0; j<b[0].length; j++)if(!b[row][j])return false;
        return true;
    }
    
    public static boolean checkCol(boolean[][] b, int col){
        for(int i=0; i<b.length; i++)if(!b[i][col])return false;
        return true;
    }
    
    public static boolean[][] createA(boolean[][] b){
        boolean[][] a = new boolean[b.length][b[0].length];
        for(int i=0; i<b.length; i++){
            for(int j=0; j<b[0].length; j++){
                if(checkElement(b,i,j)&&checkCol(b, j)&&checkRow(b, i))a[i][j]=true;
            }
        }
        return a;
    }
    
    public static void print(boolean[][] b){
        for(int i=0; i<b.length; i++){
            for(int j=0; j<b[0].length; j++)System.out.print((b[i][j]?1:0)+" ");
            System.out.println();
        }
    }
    
    public static void trueRow(boolean[][] a, int row){
        for(int i=0; i<a[0].length; i++)a[row][i]=true;
    }
    
    public static void trueCol(boolean[][] a, int col){
        for(int j=0; j<a.length; j++)a[j][col]=true;
    }
    
    public static boolean[][] createB(boolean[][] a){
        boolean[][] b1 = new boolean[a.length][a[0].length];
        for(int i=0; i<a.length; i++)
        for(int j=0; j<a[0].length; j++)
            if(a[i][j]){trueRow(b1, i); trueCol(b1, j);}
        return b1;
    }
    
    public static boolean compare(boolean[][] a, boolean[][] b){
        for(int i=0; i<a.length; i++)
            for(int j=0; j<a[0].length; j++)if(a[i][j]!=b[i][j])return false;
        return true;
    }

    public static void main(String [] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int row = Integer.parseInt(st.nextToken());
        int col = Integer.parseInt(st.nextToken());
        boolean[][] b = new boolean[row][col];
        for(int i=0; i<row; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=0; j<col; j++)b[i][j]=(Integer.parseInt(st.nextToken())==1)?true:false;
        }
        boolean[][] a = createA(b);
        
            boolean[][] b1 = createB(a);
            if(compare(b1, b)){
            System.out.println("YES");
            print(a);
            }else System.out.print("NO");
        
    }
}