#include <bits/stdc++.h>   using namespace std;   const int N = 400010;   class TWO_SAT {     vector<int> A[N], T[N];     int tag[N];     int noot[N];     vector<int> topo;     bool vis1[N];     void dfs1(int u) {       vis1[u] = true;       for (auto v : A[u])         if (!vis1[v]) dfs1(v);       topo.push_back(u);     }     bool vis2[N];     void dfs2(int u, int k) {       vis2[u] = true;       tag[u] = k;       for (auto v : T[u])         if (!vis2[v]) dfs2(v, k);     }     int dagN;     void makeDag(int n) {       memset(tag, -1, sizeof(tag));       memset(vis1, 0, sizeof(vis1));       memset(vis2, 0, sizeof(vis2));       for (int i = 0; i < n; ++i)         if (!vis1[i]) dfs1(i);       dagN = 0;       reverse(topo.begin(), topo.end());       for (auto u : topo) {         if (!vis2[u]) dfs2(u, dagN++);       }     }     bool did[N];     bool ans[N];     bool solve() {       for (int so : topo) {         if (did[tag[so]]) continue;         int si = noot[so];         if (tag[si] == tag[so]) return false;         ans[tag[si]] = 1;         ans[tag[so]] = 0;         did[tag[si]] = true;         did[tag[so]] = true;       }       return true;     }     int satn = 0;     int mapp[N];     bool exist = false;       public:     TWO_SAT() { memset(mapp, -1, sizeof(mapp)); }     bool Exist() { return exist; }     bool Solve() {       makeDag(satn);       exist = solve();       return exist;     }     void addClaw(int x1, int x2, bool b1, bool b2) {       if (mapp[x1] == -1) {         mapp[x1] = satn++;         noot[mapp[x1]] = satn++;         noot[noot[mapp[x1]]] = mapp[x1];       }       if (mapp[x2] == -1) {         mapp[x2] = satn++;         noot[mapp[x2]] = satn++;         noot[noot[mapp[x2]]] = mapp[x2];       }       x1 = mapp[x1];       if (b1) x1 = noot[x1];       x2 = mapp[x2];       if (b2) x2 = noot[x2];       A[noot[x1]].push_back(x2);       A[noot[x2]].push_back(x1);       T[x1].push_back(noot[x2]);       T[x2].push_back(noot[x1]);     }     bool Ans(int x) { return ans[tag[mapp[x]]]; }   } sat;   const int M = 2020;   char stati[M][M];   char statf[M][M];   char bar[M];   int main() {     ios::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     ;     int n;     cin >> n;     for (int i = 0; i < n; ++i) cin >> stati[i];     for (int i = 0; i < n; ++i) cin >> statf[i];     cin >> bar;     bool ans = 1;     for (int i = 0; i < n; ++i) {       for (int j = 0; j < n; ++j) {         stati[i][j] -=  0 ;         statf[i][j] -=  0 ;         if (bar[i] -  0  && bar[j] -  0 ) {           sat.addClaw(2 * i, 2 * j + 1, stati[i][j], 1 ^ statf[i][j]);           sat.addClaw(2 * i, 2 * j + 1, 1 ^ stati[i][j], statf[i][j]);         } else if (bar[j] -  0 ) {           sat.addClaw(2 * i, 2 * i, 1 ^ stati[i][j] ^ statf[i][j],                       1 ^ stati[i][j] ^ statf[i][j]);         } else if (bar[i] -  0 ) {           sat.addClaw(2 * j + 1, 2 * j + 1, 1 ^ stati[i][j] ^ statf[i][j],                       1 ^ stati[i][j] ^ statf[i][j]);         } else if (stati[i][j] ^ statf[i][j]) {           ans = 0;         }       }     }     if (!ans || !sat.Solve()) {       cout << -1 <<   n ;       return 0;     };     int cnt = 0;     for (int i = 0; i < 2 * n; i++) cnt += sat.Ans(i);     cout << cnt <<   n ;     for (int i = 0; i < 2 * n; i += 2)       if (sat.Ans(i)) cout <<  row   << i / 2 <<   n ;     for (int i = 1; i < 2 * n; i += 2)       if (sat.Ans(i)) cout <<  col   << i / 2 <<   n ;   }