#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int row_num, col_num;
int ori_martrix[210][210];
int martrix[210][210];
int row_op[210];
int col_op[210];
void init() {
  memset(row_op, 0, sizeof row_op);
  memset(col_op, 0, sizeof col_op);
  for (int i = 0; i < 210; i++) {
    for (int j = 0; j < 210; j++) martrix[i][j] = ori_martrix[i][j];
  }
}
int main() {
  cin >> row_num >> col_num;
  for (int i = 0; i < row_num; i++)
    for (int j = 0; j < col_num; j++) cin >> ori_martrix[i][j];
  init();
  for (int c = 0; c < col_num; c++) {
    if (martrix[0][c]) {
      col_op[c] = 1;
      for (int r = 0; r < row_num; r++) martrix[r][c] = (martrix[r][c] + 1) % 2;
    }
  }
  bool flag1 = true;
  for (int r = 1; r < row_num; r++) {
    int last_element = martrix[r - 1][col_num - 1];
    int div_pos = 0;
    for (int c = 1; c < col_num; c++) {
      if (martrix[r][c] != martrix[r][c - 1]) {
        div_pos = c;
        break;
      }
    }
    for (int c = div_pos + 1; c < col_num; c++) {
      if (martrix[r][c] != martrix[r][c - 1]) {
        flag1 = false;
        break;
      }
    }
    if (!flag1) break;
    if (last_element == 0 && martrix[r][0] == 1) {
      row_op[r] = 1;
      for (int c = 0; c < col_num; c++) martrix[r][c] = (martrix[r][c] + 1) % 2;
    } else if (last_element == 1 && martrix[r][0] == 0 &&
               div_pos == col_num - 1) {
      row_op[r] = 1;
      for (int c = 0; c < col_num; c++) martrix[r][c] = (martrix[r][c] + 1) % 2;
    }
    if (last_element == 0) {
      for (int c = 1; c < col_num; c++) {
        if (martrix[r][c] < martrix[r][c - 1]) {
          flag1 = false;
          break;
        }
      }
    } else {
      for (int c = 1; c < col_num; c++)
        if (martrix[r][c] != 1) {
          flag1 = false;
          break;
        }
    }
    if (!flag1) break;
  }
  bool flag2 = true;
  if (!flag1) {
    init();
    for (int c = 0; c < col_num; c++) {
      if (!martrix[row_num - 1][c]) {
        col_op[c] = 1;
        for (int r = 0; r < row_num; r++)
          martrix[r][c] = (martrix[r][c] + 1) % 2;
      }
    }
    int pre = 0;
    for (int r = 0; r < row_num - 1; r++) {
      if ((pre == 0 && martrix[r][0] == 1) ||
          (pre == 1 && martrix[r][0] == 0)) {
        row_op[r] = 1;
        for (int c = 0; c < col_num; c++)
          martrix[r][c] = (martrix[r][c] + 1) % 2;
      }
      for (int c = 1; c < col_num; c++) {
        if (martrix[r][c] < martrix[r][c - 1]) {
          flag2 = false;
          break;
        }
      }
      pre = martrix[r][col_num - 1];
      if (!flag2) break;
    }
  }
  if (flag1 || flag2) {
    cout << "YES\n";
    for (int i = 0; i < row_num; i++) cout << row_op[i];
    cout << "\n";
    for (int i = 0; i < col_num; i++) cout << col_op[i];
  } else
    cout << "NO\n";
  return 0;
}
