#include <bits/stdc++.h>
using namespace std;
struct ww {
  int x, y, z, a, b;
} g[500000];
int i, j, k, n, m, x, y, z, l, r, A, B, C, res;
int f[80][80][80], id[80][80][80];
char p[80][80];
inline void into(int x, int y, int z, int A, int B) {
  if (!f[x][y][z]) {
    f[x][y][z] = A;
    g[++r].x = x, g[r].y = y, g[r].z = z;
    id[x][y][z] = r;
    g[r].a = l;
    g[r].b = B;
  }
}
inline void work(int x, int y, int z) {
  int i;
  for (i = 1; i <= n; i++)
    if (i != x && i != y && i != z && p[i][x] == p[y][z])
      into(i, y, z, res + 1, x);
}
void dfs(int x, int y, int z) {
  int B = id[x][y][z];
  if (B == 1) return;
  int A = g[B].a;
  dfs(g[A].x, g[A].y, g[A].z);
  printf("%d %d\n", g[B].b, x);
}
int main() {
  scanf("%d%d%d%d", &n, &x, &y, &z);
  for (i = 1; i <= n; i++) scanf("%s", p[i] + 1);
  into(x, y, z, 1, 0);
  for (; l <= r; l++) {
    x = g[l].x, y = g[l].y, z = g[l].z;
    res = f[x][y][z];
    work(x, y, z);
    work(y, x, z);
    work(z, x, y);
  }
  int an = int(1e9);
  for (x = 1; x <= 3; x++)
    for (y = 1; y <= 3; y++)
      for (z = 1; z <= 3; z++)
        if (x != y && x != z && y != z && f[x][y][z] && f[x][y][z] < an) {
          an = f[x][y][z];
          A = x, B = y, C = z;
        }
  if (an < 1e9) {
    printf("%d\n", an - 1);
    dfs(A, B, C);
  } else
    printf("-1\n");
  return 0;
}
