#include <bits/stdc++.h>
using namespace std;
const int N = 74;
struct P {
  int x, y, z;
} pre[N][N][N], p;
int n, d[N][N][N];
char t[N][N];
vector<int> g[N][144];
int main() {
  scanf("%d %d %d %d", &n, &p.x, &p.y, &p.z);
  memset(d, -1, sizeof(d));
  d[p.x][p.y][p.z] = 0;
  queue<P> q;
  q.push(p);
  for (int i = 1; i <= n; i++) {
    scanf("%s", t[i] + 1);
    for (int j = 1; j <= n; j++) {
      if (i == j) continue;
      g[i][t[i][j]].push_back(j);
    }
  }
  P z = {-1, -1, -1};
  while (!q.empty()) {
    p = q.front();
    q.pop();
    int w = d[p.x][p.y][p.z];
    if (p.x + p.y + p.z == 6) {
      z = p;
      break;
    }
    for (int v : g[p.x][t[p.y][p.z]]) {
      if (v == p.y || v == p.z || d[v][p.y][p.z] != -1) continue;
      d[v][p.y][p.z] = w + 1;
      pre[v][p.y][p.z] = p;
      q.push(P{v, p.y, p.z});
    }
    for (int v : g[p.y][t[p.x][p.z]]) {
      if (v == p.x || v == p.z || d[p.x][v][p.z] != -1) continue;
      d[p.x][v][p.z] = w + 1;
      pre[p.x][v][p.z] = p;
      q.push(P{p.x, v, p.z});
    }
    for (int v : g[p.z][t[p.y][p.x]]) {
      if (v == p.y || v == p.x || d[p.x][p.y][v] != -1) continue;
      d[p.x][p.y][v] = w + 1;
      pre[p.x][p.y][v] = p;
      q.push(P{p.x, p.y, v});
    }
  }
  int ans = -1;
  vector<pair<int, int> > v;
  if (z.x != -1) {
    ans = d[z.x][z.y][z.z];
    for (int i = z.x, j = z.y, k = z.z;;) {
      P pr = pre[i][j][k];
      if (pr.x == 0) break;
      if (i != pr.x)
        v.push_back(pair<int, int>(pr.x, i));
      else if (j != pr.y)
        v.push_back(pair<int, int>(pr.y, j));
      else
        v.push_back(pair<int, int>(pr.z, k));
      i = pr.x;
      j = pr.y;
      k = pr.z;
    }
  }
  printf("%d\n", ans);
  reverse(v.begin(), v.end());
  for (pair<int, int> pa : v) printf("%d %d\n", pa.first, pa.second);
}
