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 PYTHON3):

Solution:
class CodeforcesTask486BSolution:
    def __init__(self):
        self.result = ''
        self.m_n = []
        self.matrix = []

    def read_input(self):
        self.m_n = [int(x) for x in input().split(" ")]
        for x in range(self.m_n[0]):
            self.matrix.append([int(y) for y in input().split(" ")])

    def process_task(self):
        rows = [sum(row) == self.m_n[1] for row in self.matrix]
        cols = [False] * self.m_n[1]
        for x in range(self.m_n[1]):
            col = 0
            for y in range(self.m_n[0]):
                col += self.matrix[y][x]
            if col == self.m_n[0]:
                cols[x] = True
        can = True
        #print(rows, cols)
        for x in range(self.m_n[0]):
            for y in range(self.m_n[1]):
                if self.matrix[x][y]:
                    if not (rows[x] or cols[y]):
                        # print(x, y, rows, cols)
                        can = False
                        break
            if not can:
                break
        if (sum([1 if x else 0 for x in cols]) and not sum([1 if x else 0 for x in rows])) or \
                (sum([1 if x else 0 for x in rows]) and not sum([1 if x else 0 for x in cols])):
           can = False
        if can:
            new_matrix = []
            for y in range(self.m_n[0]):
                row = []
                for x in range(self.m_n[1]):
                    row.append(1 if rows[y] and cols[x] else 0)
                new_matrix.append(row)
            self.result = "YES\n{0}".format("\n".join([" ".join([str(x) for x in row]) for row in new_matrix]))
        else:
            self.result = "NO"

    def get_result(self):
        return self.result


if __name__ == "__main__":
    Solution = CodeforcesTask486BSolution()
    Solution.read_input()
    Solution.process_task()
    print(Solution.get_result())