#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
int a[220][220], b[220][220];
int n, m;
vector<int> vec;
int val[220], flag[220];
int first[220];
int state() {
  int id = 0;
  for (int i = 1; i <= m; i++) {
    if (first[i] == 0)
      id = i;
    else
      break;
  }
  if (id == m) return 1;
  id = 0;
  for (int i = 1; i <= m; i++) {
    if (first[i])
      id = i;
    else
      break;
  }
  if (id == m) return 2;
  id = 0;
  for (int i = 1; i <= m; i++) {
    if (first[i] == 0)
      id = i;
    else
      break;
  }
  int ID = m;
  for (int i = m; i >= 1; i--) {
    if (first[i])
      ID = i;
    else
      break;
  }
  if (id + 1 == ID) return 3;
  id = 0;
  for (int i = 1; i <= m; i++) {
    if (first[i])
      id = i;
    else
      break;
  }
  ID = m;
  for (int i = m; i >= 1; i--) {
    if (!first[i])
      ID = i;
    else
      break;
  }
  if (id + 1 == ID) return 4;
  return 0;
}
void update() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      b[i][j] = a[i][j];
    }
  }
  for (int i = 1; i <= n; i++) {
    for (auto j : vec) {
      b[i][j] ^= 1;
    }
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) first[j] = b[i][j];
    flag[i] = state();
  }
  int id = 1;
  for (int i = 1; i <= n; i++) {
    if (!flag[i]) return;
    if (flag[i] == 3 || flag[i] == 4) {
      id = i;
      break;
    }
  }
  for (int i = id + 1; i <= n; i++)
    if (flag[i] == 3 || flag[i] == 4) return;
  puts("YES");
  for (int i = 1; i < id; i++) {
    if (flag[i] == 1)
      putchar('0');
    else
      putchar('1');
  }
  if (flag[id] == 3)
    putchar('0');
  else
    putchar('1');
  for (int i = id + 1; i <= n; i++) {
    if (flag[i] == 1)
      putchar('1');
    else
      putchar('0');
  }
  puts("");
  for (int i = 1; i <= m; i++) val[i] = 0;
  for (auto u : vec) val[u] = 1;
  for (int i = 1; i <= m; i++) printf("%d", val[i]);
  puts("");
  exit(0);
}
int main() {
  scanf("%d %d", &n, &m);
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      scanf("%d", a[i] + j);
    }
  }
  vec.clear();
  for (int i = 1; i <= m; i++)
    if (a[1][i]) vec.push_back(i);
  update();
  vec.clear();
  for (int i = 1; i <= m; i++)
    if (!a[1][i]) vec.push_back(i);
  update();
  vec.clear();
  for (int i = 1; i <= m; i++)
    if (a[n][i]) vec.push_back(i);
  update();
  vec.clear();
  for (int i = 1; i <= m; i++)
    if (!a[n][i]) vec.push_back(i);
  update();
  puts("NO");
}
