#include <bits/stdc++.h>
using namespace std;
const int N = 75;
int dist[N][N][N];
pair<int, int> nxt[N][N][N];
char matrix[N][N];
int INF, n;
struct state {
  int i;
  int j;
  int k;
};
void bfs() {
  queue<state> qq;
  qq.push({1, 2, 3});
  dist[1][2][3] = 0;
  qq.push({1, 3, 2});
  dist[1][3][2] = 0;
  qq.push({2, 1, 3});
  dist[2][1][3] = 0;
  qq.push({2, 3, 1});
  dist[2][3][1] = 0;
  qq.push({3, 1, 2});
  dist[3][1][2] = 0;
  qq.push({3, 2, 1});
  dist[3][2][1] = 0;
  while (!qq.empty()) {
    auto cur = qq.front();
    qq.pop();
    for (int m = 1; m <= n; m++) {
      if (m == cur.i || m == cur.j || m == cur.k) continue;
      if (matrix[cur.i][cur.j] == matrix[cur.k][m] &&
          dist[cur.i][cur.j][m] == INF) {
        dist[cur.i][cur.j][m] = dist[cur.i][cur.j][cur.k] + 1;
        nxt[cur.i][cur.j][m] = {m, cur.k};
        qq.push({cur.i, cur.j, m});
      }
      if (matrix[cur.i][cur.k] == matrix[cur.j][m] &&
          dist[cur.i][m][cur.k] == INF) {
        dist[cur.i][m][cur.k] = dist[cur.i][cur.j][cur.k] + 1;
        nxt[cur.i][m][cur.k] = {m, cur.j};
        qq.push({cur.i, m, cur.k});
      }
      if (matrix[cur.j][cur.k] == matrix[cur.i][m] &&
          dist[m][cur.j][cur.k] == INF) {
        dist[m][cur.j][cur.k] = dist[cur.i][cur.j][cur.k] + 1;
        nxt[m][cur.j][cur.k] = {m, cur.i};
        qq.push({m, cur.j, cur.k});
      }
    }
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  memset(dist, 62, sizeof(dist));
  INF = dist[0][0][0];
  cin >> n;
  int a, b, c;
  cin >> a >> b >> c;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) cin >> matrix[i][j];
  bfs();
  if (dist[a][b][c] == INF) dist[a][b][c] = -1;
  cout << dist[a][b][c] << "\n";
  while (dist[a][b][c] > 0) {
    if (a == nxt[a][b][c].first) {
      cout << nxt[a][b][c].first << " " << nxt[a][b][c].second << "\n";
      a = nxt[a][b][c].second;
    } else {
      if (b == nxt[a][b][c].first) {
        cout << nxt[a][b][c].first << " " << nxt[a][b][c].second << "\n";
        b = nxt[a][b][c].second;
      } else {
        cout << nxt[a][b][c].first << " " << nxt[a][b][c].second << "\n";
        c = nxt[a][b][c].second;
      }
    }
  }
  return 0;
}
