#include <bits/stdc++.h>
using namespace std;
const long long maxn = 2e3 + 10;
long long A[maxn][maxn];
long long B[maxn][maxn];
long long X[maxn];
long long n, m, k;
vector<long long> P;
bool used[4 * maxn];
long long C[4 * maxn];
bool dor[maxn];
bool dos[maxn];
long long RP[4 * maxn];
vector<long long> V[4 * maxn];
void dfs(long long v) {
  used[v] = 1;
  long long q;
  for (q = 0; q < V[v].size(); q++) {
    if (used[V[v][q]]) {
      continue;
    }
    dfs(V[v][q]);
  }
  P.push_back(v);
}
void addedge(long long i, long long is1, long long isrow1, long long j,
             long long is2, long long isrow2) {
  long long i1 = i + n * 2 * isrow1 + n * is1;
  long long j1 = j + n * 2 * isrow2 + n * is2;
  V[i1].push_back(j1);
}
long long color = 1;
void dfs1(long long v) {
  used[v] = 1;
  C[v] = color;
  long long q;
  for (q = 0; q < V[v].size(); q++) {
    if (used[V[v][q]]) {
      continue;
    }
    dfs1(V[v][q]);
  }
}
long long getnotx(long long x) {
  if ((x / n) % 2 == 0) {
    return x + n;
  }
  return x - n;
}
void choose(long long x) {
  if ((x / n) % 2 == 1) {
    if (x / n < 2) {
      dos[x % n] = 1;
    } else {
      dor[x % n] = 1;
    }
  }
}
int main() {
  long long q, w, a, b;
  cin >> n;
  string s;
  for (q = 0; q < n; q++) {
    cin >> s;
    for (w = 0; w < n; w++) {
      if (s[w] == '1') {
        A[q][w] = 1;
      }
    }
  }
  for (q = 0; q < n; q++) {
    cin >> s;
    for (w = 0; w < n; w++) {
      if (s[w] == '1') {
        B[q][w] = 1;
      }
    }
  }
  cin >> s;
  for (q = 0; q < n; q++) {
    if (s[q] == '1') {
      X[q] = 1;
    }
  }
  for (q = 0; q < n; q++) {
    for (w = 0; w < n; w++) {
      long long a00 = A[q][w];
      long long a01 = A[q][w] ^ X[q];
      long long a10 = A[q][w] ^ X[w];
      long long a11 = A[q][w] ^ X[q] ^ X[w];
      if (a00 != B[q][w]) {
        addedge(q, 0, 0, w, 1, 1);
        addedge(w, 0, 1, q, 1, 0);
      }
      if (a01 != B[q][w]) {
        addedge(q, 0, 0, w, 0, 1);
        addedge(w, 1, 1, q, 1, 0);
      }
      if (a10 != B[q][w]) {
        addedge(q, 1, 0, w, 1, 1);
        addedge(w, 0, 1, q, 0, 0);
      }
      if (a11 != B[q][w]) {
        addedge(q, 1, 0, w, 0, 1);
        addedge(w, 1, 1, q, 0, 0);
      }
    }
  }
  for (q = 0; q < 4 * n; q++) {
    if (!used[q]) {
      dfs(q);
    }
  }
  for (q = 0; q < 4 * n; q++) {
    used[q] = 0;
  }
  for (q = 0; q < P.size(); q++) {
    if (!used[P[q]]) {
      dfs1(P[q]);
      color++;
    }
  }
  for (q = 0; q < 4 * n; q++) {
    long long nq = getnotx(q);
    if (C[q] == C[nq]) {
      cout << -1;
      return 0;
    }
  }
  for (q = 0; q < 4 * n; q++) {
    RP[P[q]] = q;
  }
  for (q = 0; q < 4 * n; q++) {
    long long nq = getnotx(q);
    if (RP[q] < RP[nq]) {
      choose(q);
    } else {
      choose(nq);
    }
  }
  long long sum = 0;
  for (q = 0; q < n; q++) {
    sum += dos[q];
    sum += dor[q];
  }
  cout << sum << endl;
  for (q = 0; q < n; q++) {
    if (dos[q]) {
      cout << "row " << q << endl;
    }
    if (dor[q]) {
      cout << "col " << q << endl;
    }
  }
}
