#include <bits/stdc++.h>
using namespace std;
namespace wode {
template <typename T>
inline void read(T &x) {
  static char ch;
  bool f = 1;
  for (x = 0, ch = getchar(); !isdigit(ch); ch = getchar())
    if (ch == '-') f = 0;
  for (; isdigit(ch); x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar())
    ;
  x = f ? x : -x;
}
template <typename T>
void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
inline void print(T x, char ap) {
  print(x);
  if (ap) putchar(ap);
}
template <typename T>
inline T max(T x, T y) {
  return x < y ? y : x;
}
template <typename T>
inline T min(T x, T y) {
  return x < y ? x : y;
}
template <typename T>
inline void chkmax(T &x, T y) {
  x = x < y ? y : x;
}
template <typename T>
inline void chkmin(T &x, T y) {
  x = x < y ? x : y;
}
}  // namespace wode
using wode::chkmax;
using wode::chkmin;
using wode::print;
using wode::read;
int n, m;
bool vis[210], a[210][210], tar[210], tot[210];
inline bool check() {
  bool ff = false;
  for (register int i = 1; i <= n; ++i) {
    int now = a[i][1] ^ tar[1];
    for (register int j = 2; j <= m; ++j)
      if (a[i][j] ^ tar[j] ^ now) {
        if (ff) return false;
        ff = true, now = a[i][j] ^ tar[j];
      }
    tot[i] = now ^ ff;
  }
  return true;
}
int main() {
  read(n), read(m);
  for (register int i = 1; i <= n; ++i)
    for (register int j = 1; j <= m; ++j) read(a[i][j]);
  for (register int i = 1; i <= m; ++i) tar[i] = a[1][i] ^ 1;
  for (register int i = 0; i <= m; ++i) {
    tar[i] ^= 1;
    if (check()) {
      puts("YES");
      for (register int j = 1; j <= n; ++j) print(tot[j]);
      puts("");
      for (register int j = 1; j <= m; ++j) print(tar[j]);
      puts("");
      return 0;
    }
  }
  puts("NO");
  return 0;
}
