#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;   }