#include <bits/stdc++.h>
using namespace std;
const int N = 2e2 + 7;
int n, m;
vector<vector<int>> arr;
int isRow(int row) {
  bool zero = 1;
  bool one = 1;
  for (int j = 0; j < m; ++j) {
    zero &= (arr[row][j] ^ arr[0][j]) == 0;
    one &= (arr[row][j] ^ arr[0][j]) == 1;
  }
  if (!zero && !one) {
    return -1;
  }
  return one;
}
int specRow(int row) {
  bool flag = 1;
  for (int j = 0; j < m; ++j) {
    if (flag) {
      if ((arr[row][j] ^ arr[0][j]) == (arr[row][0] ^ arr[0][0])) {
        continue;
      }
      flag = 0;
    } else {
      if ((arr[row][j] ^ arr[0][j]) == (arr[row][0] ^ arr[0][0])) {
        return -1;
      }
    }
  }
  return arr[row][0] ^ arr[0][0];
}
vector<vector<int>> solve() {
  bool flag = 0;
  bool cool = 1;
  for (int i = 1; i < n; ++i) {
    if (isRow(i) != -1) {
      continue;
    }
    if (flag || !specRow(i) == -1) {
      cool = 0;
      continue;
    }
    flag = 1;
  }
  vector<vector<int>> res(2);
  if (!cool) {
    return res;
  }
  res[0].resize(n);
  res[1].resize(m);
  for (int i = 0; i < m; ++i) {
    res[1][i] = arr[0][i];
  }
  flag = 0;
  for (int i = 1; i < n; ++i) {
    if (isRow(i) != -1) {
      res[0][i] = isRow(i) != flag;
      continue;
    }
    res[0][i] = specRow(i) != flag;
    flag = 1;
  }
  return res;
}
int main() {
  ios::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  cin >> n >> m;
  arr.resize(n, vector<int>(m));
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < m; ++j) {
      cin >> arr[i][j];
    }
  }
  if (n == 1) {
    cout << "YES\n0\n";
    for (int i = 0; i < m; ++i) {
      cout << !arr[0][i];
    }
    cout << "\n";
    return 0;
  }
  auto res = solve();
  if (res[0].empty()) {
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m; ++j) {
        arr[i][j] = !arr[i][j];
      }
    }
    for (int i = 0; i < n / 2; ++i) {
      swap(arr[i], arr[n - i - 1]);
    }
    for (int i = 0; i < n; ++i) {
      for (int j = 0; j < m / 2; ++j) {
        swap(arr[i][j], arr[i][m - 1 - j]);
      }
    }
    res = solve();
    if (!res[0].empty()) {
      for (int i = 0; i < n / 2; ++i) {
        swap(res[0][i], res[0][n - i - 1]);
      }
      for (int i = 0; i < m / 2; ++i) {
        swap(res[1][i], res[1][m - 1 - i]);
      }
    }
  }
  if (res[0].empty()) {
    cout << "NO\n";
    return 0;
  }
  cout << "YES\n";
  for (auto i : res) {
    for (auto j : i) {
      cout << j;
    }
    cout << "\n";
  }
  return 0;
}
