#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100;
void msort(int &x, int &y, int &z) {
  if (x > y) swap(x, y);
  if (y > z) swap(y, z);
  if (x > y) swap(x, y);
}
class state {
 public:
  int a, b, c, dis, m1, m2;
  state *par;
  state(int x, int y, int z) {
    a = x;
    b = y;
    c = z;
    dis = 0;
    msort(a, b, c);
    par = NULL;
  }
  state() { dis = a = b = c = 0; }
};
state *start;
void write(state *p) {
  if (p == start) return;
  write(p->par);
  cout << p->m2 << " " << p->m1 << "\n";
}
int n, e[MAXN][MAXN];
bool vis[MAXN][MAXN][MAXN];
int main() {
  ios::sync_with_stdio(false);
  cin >> n;
  int a, b, c;
  cin >> a >> b >> c;
  a--;
  b--;
  c--;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      char chr;
      cin >> chr;
      e[i][j] = chr - 'a';
    }
  start = new state(a, b, c);
  vis[a][b][c] = true;
  start->dis = 0;
  queue<state *> q;
  q.push(start);
  int cnt = 0;
  while (q.size() && cnt++ < 3e5 + 10) {
    state *f = q.front();
    q.pop();
    int x = f->a, y = f->b, z = f->c;
    if (x == 0 && y == 1 && z == 2) {
      cout << f->dis << "\n";
      write(f);
      return 0;
    }
    if (x == y || x == z || y == z) continue;
    for (int k = 0; k < 3; k++) {
      for (int i = 0; i < n; i++)
        if (i != x && i != y && i != z && e[y][z] == e[x][i]) {
          int ta = i, tb = y, tc = z;
          msort(ta, tb, tc);
          if (!vis[ta][tb][tc]) {
            state *dum = new state(ta, tb, tc);
            vis[ta][tb][tc] = true;
            q.push(dum);
            dum->dis = f->dis + 1;
            dum->par = f;
            dum->m1 = i + 1;
            dum->m2 = x + 1;
          }
        }
      swap(x, z);
      swap(y, z);
    }
  }
  cout << -1;
}
