#include <bits/stdc++.h>
using namespace std;
const int N = 80, mod = int(1e9) + 7;
queue<pair<int, pair<int, int> > > q;
int x, y, z, n;
char second[N][N];
int dp[N][N][N];
vector<pair<int, pair<int, int> > > v;
pair<int, pair<int, int> > p, pred[N][N][N];
int a, b, c;
int xx[N];
int main() {
  scanf("%d\n", &n);
  scanf("%d%d%d\n", &x, &y, &z);
  for (int i = 1; i <= n; i++) {
    scanf("%s\n", second[i] + 1);
  }
  memset(dp, -1, sizeof(dp));
  dp[x][y][z] = 0;
  q.push(make_pair(x, make_pair(y, z)));
  while (!q.empty()) {
    p = q.front();
    a = p.first;
    b = p.second.first;
    c = p.second.second;
    q.pop();
    for (int i = 1; i <= n; i++) {
      if (second[a][b] == second[c][i] && i != a && i != b) {
        if (dp[a][b][i] == -1) {
          dp[a][b][i] = dp[a][b][c] + 1;
          pred[a][b][i] = make_pair(a, make_pair(b, c));
          q.push(make_pair(a, make_pair(b, i)));
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      if (second[a][c] == second[b][i] && i != a && i != c) {
        if (dp[a][i][c] == -1) {
          dp[a][i][c] = dp[a][b][c] + 1;
          pred[a][i][c] = make_pair(a, make_pair(b, c));
          q.push(make_pair(a, make_pair(i, c)));
        }
      }
    }
    for (int i = 1; i <= n; i++) {
      if (second[c][b] == second[a][i] && i != c && i != b) {
        if (dp[i][b][c] == -1) {
          dp[i][b][c] = dp[a][b][c] + 1;
          pred[i][b][c] = make_pair(a, make_pair(b, c));
          q.push(make_pair(i, make_pair(b, c)));
        }
      }
    }
  }
  int mn = -1;
  for (int i = 1; i <= 3; i++) xx[i] = i;
  do {
    if (dp[xx[1]][xx[2]][xx[3]] != -1) {
      if (mn == -1 || mn > dp[xx[1]][xx[2]][xx[3]]) {
        mn = dp[xx[1]][xx[2]][xx[3]];
        a = xx[1];
        b = xx[2];
        c = xx[3];
      }
    }
  } while (next_permutation(xx + 1, xx + 4));
  if (mn == -1) {
    puts("-1");
    return 0;
  }
  while (a > 0 && b > 0 && c > 0) {
    v.push_back(make_pair(a, make_pair(b, c)));
    p = pred[a][b][c];
    a = p.first;
    b = p.second.first;
    c = p.second.second;
  }
  reverse(v.begin(), v.end());
  cout << v.size() - 1 << endl;
  for (int i = 1; i < v.size(); i++) {
    x = v[i - 1].first;
    y = v[i - 1].second.first;
    z = v[i - 1].second.second;
    a = v[i].first;
    b = v[i].second.first;
    c = v[i].second.second;
    if (x != a) {
      printf("%d %d\n", x, a);
    } else if (y != b) {
      printf("%d %d\n", y, b);
    } else if (z != c) {
      printf("%d %d\n", z, c);
    }
  }
  return 0;
}
