#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:167177216")
using namespace std;
const int INF = 1e9;
const long double eps = 1e-9;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
struct pp {
  int x, y, z;
};
queue<pp> q;
bool used[77][77][77];
int d[77][77][77];
pp from[77][77][77];
int main() {
  int n;
  int a, b, c;
  cin >> n;
  cin >> a >> b >> c;
  char matr[77][77];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) cin >> matr[i][j];
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= n; j++)
      for (int k = 0; k <= n; k++) d[i][j][k] = INF;
  pp s;
  s.x = a;
  s.y = b;
  s.z = c;
  q.push(s);
  d[a][b][c] = 0;
  while (!q.empty()) {
    pp v = q.front();
    q.pop();
    int curx = v.x;
    int cury = v.y;
    int curz = v.z;
    char must = matr[curx][cury];
    for (int i = 1; i <= n; i++) {
      int nx = curx;
      int ny = cury;
      int nz = curz;
      nz = i;
      if (nz != curx && nz != cury && matr[curz][nz] == must &&
          !used[nx][ny][nz]) {
        pp to;
        to.x = nx;
        to.y = ny;
        to.z = nz;
        q.push(to);
        d[nx][ny][nz] = d[curx][cury][curz] + 1;
        from[nx][ny][nz] = v;
        used[nx][ny][nz] = true;
      }
    }
    must = matr[cury][curz];
    for (int i = 1; i <= n; i++) {
      int nx = curx;
      int ny = cury;
      int nz = curz;
      nx = i;
      if (nx != cury && nx != curz && matr[curx][nx] == must &&
          !used[nx][ny][nz]) {
        pp to;
        to.x = nx;
        to.y = ny;
        to.z = nz;
        q.push(to);
        d[nx][ny][nz] = d[curx][cury][curz] + 1;
        from[nx][ny][nz] = v;
        used[nx][ny][nz] = true;
      }
    }
    must = matr[curx][curz];
    for (int i = 1; i <= n; i++) {
      int nx = curx;
      int ny = cury;
      int nz = curz;
      ny = i;
      if (ny != curx && ny != curz && matr[cury][ny] == must &&
          !used[nx][ny][nz]) {
        pp to;
        to.x = nx;
        to.y = ny;
        to.z = nz;
        q.push(to);
        d[nx][ny][nz] = d[curx][cury][curz] + 1;
        from[nx][ny][nz] = v;
        used[nx][ny][nz] = true;
      }
    }
  }
  int ansval = INF;
  pp best;
  vector<int> v;
  for (int i = 0; i < 3; i++) v.push_back(i);
  do {
    pp cur;
    cur.x = v[0] + 1;
    cur.y = v[1] + 1;
    cur.z = v[2] + 1;
    if (d[cur.x][cur.y][cur.z] < ansval) {
      ansval = d[cur.x][cur.y][cur.z];
      best = cur;
    }
  } while (next_permutation(v.begin(), v.end()));
  if (ansval == INF) {
    cout << -1 << endl;
    return 0;
  }
  vector<pair<int, int> > ans;
  pp cur = best;
  while (cur.x != a || cur.y != b || cur.z != c) {
    pp ncur = from[cur.x][cur.y][cur.z];
    if (ncur.x != cur.x)
      ans.push_back(make_pair(ncur.x, cur.x));
    else if (ncur.y != cur.y)
      ans.push_back(make_pair(ncur.y, cur.y));
    else
      ans.push_back(make_pair(ncur.z, cur.z));
    cur = ncur;
  }
  cout << ans.size() << endl;
  for (int i = ans.size() - 1; i >= 0; i--)
    cout << ans[i].first << ' ' << ans[i].second << endl;
  return 0;
}
