#include <bits/stdc++.h>
using namespace std;
const int __SIZE = 1 << 18;
char ibuf[__SIZE], *iS, *iT;
template <typename T>
inline void read(T &x) {
  char ch, t = 0;
  x = 0;
  while (!isdigit(ch = (iS == iT
                            ? (iT = (iS = ibuf) + fread(ibuf, 1, __SIZE, stdin),
                               (iS == iT ? EOF : *iS++))
                            : *iS++)))
    t |= ch == '-';
  while (isdigit(ch))
    x = x * 10 + (ch ^ 48),
    ch = (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, __SIZE, stdin),
                      (iS == iT ? EOF : *iS++))
                   : *iS++);
  x = t ? -x : x;
}
inline int read_int() {
  int x;
  return read(x), x;
}
inline long long read_ll() {
  long long x;
  return read(x), x;
}
template <typename T>
inline void chkmin(T &a, T b) {
  a = a < b ? a : b;
}
template <typename T>
inline void chkmax(T &a, T b) {
  a = a > b ? a : b;
}
int n, m;
bitset<210> a[210], R, C, M, t, T;
inline void print() {
  puts("YES");
  for (int i = 0; i < n; i++) putchar(R[i] | 48);
  puts("");
  for (int i = 0; i < m; i++) putchar(C[i] | 48);
  puts("");
  exit(0);
}
inline int check() {
  int diff = 0;
  for (int i = 0; i < n; i++) {
    t = a[i] ^ C, T = t >> 1, T[m - 1] = T[m - 2];
    int x = t.count();
    int y = (t ^ T).count();
    if (!y)
      R[i] = t[0] ^ diff;
    else {
      diff += y;
      if (diff > 1) return 0;
      R[i] = t[0];
    }
  }
  return 1;
}
int main() {
  n = read_int(), m = read_int();
  for (int i = 0; i < m; i++) M.set(i);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < m; j++) a[i][j] = read_int();
  if (m == 1) {
    puts("YES\n");
    for (int i = 0; i < n; i++) putchar(a[i][0] | 48);
    puts("\n0");
    return 0;
  }
  C = a[0];
  if (check()) print();
  C = a[0], C.flip(), C &= M;
  if (check()) print();
  C = a[n - 1];
  if (check()) print();
  C = a[n - 1], C.flip(), C &= M;
  if (check()) print();
  return puts("NO"), 0;
}
