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

Solution:
import fileinput

def proc_input(args=[]):
	m = 0
	n = 0
	b = []
	size_known = False
	for l in args:
		if not size_known:
			size_known = True
			(m, n) = [ int(x) for x in l.split() ]
		else:
			b.append([ int(x) for x in l.split() ])
	return(m, n, b)

def gen(prefix, m, n, s):
	t = [ [ (prefix + 1) & 1 for c in xrange(n) ] for r in xrange(m) ]
	for r in xrange(m):
		for c in xrange(n):
			if s[r][c] == prefix:
				t[r] = [ prefix for _c in xrange(n) ]
				for _r in xrange(m):
					t[_r][c] = prefix
	return t

def gen_a(m, n, b):
	return gen(0, m, n, b)

def gen_b(m, n, a):
	return gen(1, m, n, a)

def solve(args, verbose=False):
	(m, n, b) = proc_input(args)
	a = gen_a(m, n, b)
	if(gen_b(m, n, a) == b):
		(r_v, r_a) = (True, a)
	else:
		(r_v, r_a) = (False, [])

	if(verbose):
		if not r_v:
			print 'NO'
		else:
			print 'YES'
			print '\n'.join([ ' '.join([ str(c) for c in r ]) for r in a ])
	return((r_v, r_a))

def test():
	assert(proc_input([ '1 1', '0' ]) == (1, 1, [ [ 0 ] ]))
	assert(proc_input([ '2 1', '1 0' ]) == (2, 1, [ [ 1, 0 ] ]))
	assert(gen_a(1, 1, [ [ 0 ] ]) == [ [ 0 ] ])
	assert(gen_a(1, 1, [ [ 1 ] ]) == [ [ 1 ] ])
	assert(gen_a(2, 2, [ [ 1, 0 ], [ 0, 0 ] ]) == [ [ 0, 0 ], [ 0, 0 ] ])
	assert(gen_b(2, 2, [ [ 0, 0 ], [ 0, 0 ] ]) == [ [ 0, 0 ], [ 0, 0 ] ])
	assert(solve([ '2 2', '1 0', '0 0' ]) == (False, []))
	assert(solve([ '2 3', '1 1 1', '1 1 1' ]) == (True, [ [ 1, 1, 1 ], [ 1, 1, 1 ] ]))
	assert(solve([ '2 3', '0 1 0', '1 1 1' ]) == (True, [ [ 0, 0, 0 ], [ 0, 1, 0 ] ]))

if __name__ == '__main__':
	from sys import argv
	if(argv.pop() == 'test'):
		test()
	else:
		solve(fileinput.input(), verbose=True)