#include <bits/stdc++.h>
using namespace std;
const int N = 1000 + 7;
const int inf = 0x3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + 7;
const double eps = 1e-8;
const double PI = acos(-1);
template <class T, class S>
inline void add(T& a, S b) {
  a += b;
  if (a >= mod) a -= mod;
}
template <class T, class S>
inline void sub(T& a, S b) {
  a -= b;
  if (a < 0) a += mod;
}
template <class T, class S>
inline bool chkmax(T& a, S b) {
  return a < b ? a = b, true : false;
}
template <class T, class S>
inline bool chkmin(T& a, S b) {
  return a > b ? a = b, true : false;
}
int fa[N], row[N], col[N];
int now[N];
bool vis[N];
int getRoot(int x) { return x == fa[x] ? x : fa[x] = getRoot(fa[x]); }
int n, m, all;
int a[N][N];
void print() {
  puts("YES");
  for (int i = 1; i <= 2 * all; i++) {
    if (vis[i]) continue;
    int rt = getRoot(i);
    for (int j = 1; j <= 2 * all; j++) {
      if (vis[j]) continue;
      if (getRoot(j) == rt) {
        if (j <= all) {
          if (j <= n) {
            row[j] = 0;
            vis[j] = true;
            vis[j + all] = true;
          } else {
            col[j - n] = 0;
            vis[j] = true;
            vis[j + all] = true;
          }
        } else {
          if (j <= n + all) {
            row[j - all] = 1;
            vis[j] = true;
            vis[j - all] = true;
          } else {
            col[j - all - n] = 1;
            vis[j] = true;
            vis[j - all] = true;
          }
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) printf("%d", row[i]);
  puts("");
  for (int i = 1; i <= m; i++) printf("%d", col[i]);
  puts("");
}
bool check(int x, int y) {
  for (int i = 1; i <= 2 * all; i++) fa[i] = now[i];
  for (int i = x; i <= n; i++) {
    for (int j = (i == x ? y : 1); j <= m; j++) {
      if (a[i][j] == 0) {
        if (getRoot(i + all) == getRoot(j + n + all)) {
          return false;
        }
        fa[getRoot(i)] = getRoot(j + n + all);
        fa[getRoot(i + all)] = getRoot(j + n);
      } else {
        if (getRoot(i + all) == getRoot(j + n)) {
          return false;
        }
        fa[getRoot(i)] = getRoot(j + n);
        fa[getRoot(i + all)] = getRoot(j + n + all);
      }
    }
  }
  return 1;
}
int main() {
  scanf("%d%d", &n, &m);
  all = n + m;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= m; j++) scanf("%d", &a[i][j]);
  bool flag = true;
  for (int i = 1; i <= 2 * all; i++) now[i] = i;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (check(i, j)) {
        print();
        return 0;
      }
      for (int k = 1; k <= 2 * all; k++) fa[k] = now[k];
      if (a[i][j] == 0) {
        if (getRoot(i + all) == getRoot(j + n)) flag = false;
        fa[getRoot(i)] = getRoot(j + n);
        fa[getRoot(i + all)] = getRoot(j + n + all);
      } else {
        if (getRoot(i + all) == getRoot(j + n + all)) flag = false;
        fa[getRoot(i)] = getRoot(j + n + all);
        fa[getRoot(i + all)] = getRoot(j + n);
      }
      for (int k = 1; k <= 2 * all; k++) now[k] = fa[k];
      if (!flag) break;
    }
  }
  if (flag) {
    print();
  }
  puts("NO");
  return 0;
}
