#include <bits/stdc++.h>
using namespace std;
template <class T>
bool chmax(T& a, const T& b) {
  if (a < b) {
    a = b;
    return 1;
  }
  return 0;
}
template <class T>
bool chmin(T& a, const T& b) {
  if (b < a) {
    a = b;
    return 1;
  }
  return 0;
}
const long long int MOD = 1e9 + 7, INF = 1e18;
long long int dx[8] = {0, -1, 1, 0, 1, -1, 1, -1},
              dy[8] = {1, 0, 0, -1, -1, -1, 1, 1};
struct edge {
  long long int cost;
  long long int u, v;
};
long long int N, M;
long long int mp[200][200];
long long int delta[200][200];
int main() {
  cin >> N >> M;
  for (long long int i = (0), i_end_ = (N); i < i_end_; i++) {
    for (long long int j = (0), j_end_ = (M); j < j_end_; j++) {
      cin >> mp[i][j];
    }
  }
  for (long long int i = (0), i_end_ = (N); i < i_end_; i++) {
    for (long long int j = (0), j_end_ = (M); j < j_end_; j++) {
      delta[i][j] = mp[i][j];
    }
  }
  bool flag = true;
  vector<pair<long long int, long long int> > pos;
  vector<long long int> _row_ans;
  vector<long long int> _column_ans;
  _row_ans.push_back(0);
  if (mp[0][0] == 0)
    _column_ans.push_back(0);
  else
    _column_ans.push_back(1);
  for (long long int i = (0), i_end_ = (M - 1); i < i_end_; i++) {
    _column_ans.push_back(mp[0][i] ^ mp[0][i + 1] ^ _column_ans.back());
  }
  for (long long int i = (0), i_end_ = (N - 1); i < i_end_; i++) {
    _row_ans.push_back(mp[i][0] ^ mp[i + 1][0] ^ _row_ans.back());
    for (long long int j = (0), j_end_ = (M - 1); j < j_end_; j++) {
      if ((mp[0][j] ^ mp[0][j + 1]) != (mp[i + 1][j] ^ mp[i + 1][j + 1])) {
        pos.push_back({i + 1, j + 1});
        flag = false;
      }
    }
  }
  if (flag) {
    cout << "YES" << '\n';
    for (long long int i = (0), i_end_ = (N); i < i_end_; i++)
      cout << _row_ans[i];
    cout << '\n';
    for (long long int i = (0), i_end_ = (M); i < i_end_; i++)
      cout << _column_ans[i];
    cout << '\n';
    return 0;
  }
  if (((long long int)(pos).size()) != 1) {
    bool _flag = true;
    for (long long int i = (0), i_end_ = (((long long int)(pos).size()));
         i < i_end_; i++) {
      if (pos[i].first == 0) _flag = false;
      if (pos[0].second != pos[i].second) _flag = false;
    }
    for (long long int i = (0), i_end_ = (((long long int)(pos).size()) - 1);
         i < i_end_; i++) {
      if (pos[i].first + 1 != pos[i + 1].first) _flag = false;
    }
    if (((long long int)(pos).size()) != N - 1) _flag = false;
    if (_flag) {
      long long int r = pos[0].second;
      pos.clear();
      pos.push_back({0, r});
    } else {
      cout << "NO" << '\n';
      return 0;
    }
  }
  for (long long int i = (0), i_end_ = (N); i < i_end_; i++) {
    for (long long int j = (0), j_end_ = (M); j < j_end_; j++) {
      if (i * M + j >= pos[0].first * M + pos[0].second) mp[i][j] ^= 1;
    }
  }
  _row_ans.clear();
  _column_ans.clear();
  _row_ans.push_back(0);
  if (mp[0][0] == 0)
    _column_ans.push_back(0);
  else
    _column_ans.push_back(1);
  for (long long int i = (0), i_end_ = (M - 1); i < i_end_; i++) {
    _column_ans.push_back(mp[0][i] ^ mp[0][i + 1] ^ _column_ans.back());
  }
  for (long long int i = (0), i_end_ = (N - 1); i < i_end_; i++) {
    _row_ans.push_back(mp[i][0] ^ mp[i + 1][0] ^ _row_ans.back());
  }
  cout << "YES" << '\n';
  for (long long int i = (0), i_end_ = (N); i < i_end_; i++)
    cout << _row_ans[i];
  cout << '\n';
  for (long long int i = (0), i_end_ = (M); i < i_end_; i++)
    cout << _column_ans[i];
  cout << '\n';
  return 0;
}
