#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, z;
};
const int maxn = 100;
int table[maxn][maxn];
int dist[maxn][maxn][maxn];
node par[maxn][maxn][maxn];
bool vis[maxn][maxn][maxn];
queue<node> bq;
int n;
inline void sort_3(int &x, int &y, int &z) {
  if (x > y) swap(x, y);
  if (x > z) swap(x, z);
  if (y > z) swap(y, z);
}
inline void mark(int x, int y, int z, int i, int j, int k, int d) {
  sort_3(x, y, z);
  sort_3(i, j, k);
  if (vis[x][y][z]) return;
  vis[x][y][z] = true;
  dist[x][y][z] = d;
  par[x][y][z] = {i, j, k};
  bq.push({x, y, z});
}
inline pair<int, int> diff(node p, node q) {
  pair<int, int> ans;
  if (p.x != q.x and p.x != q.y and p.x != q.z)
    ans.first = p.x;
  else if (p.y != q.x and p.y != q.y and p.y != q.z)
    ans.first = p.y;
  else if (p.z != q.x and p.z != q.y and p.z != q.z)
    ans.first = p.z;
  if (q.x != p.x and q.x != p.y and q.x != p.z)
    ans.second = q.x;
  else if (q.y != p.x and q.y != p.y and q.y != p.z)
    ans.second = q.y;
  else if (q.z != p.x and q.z != p.y and q.z != p.z)
    ans.second = q.z;
  return ans;
}
inline void bfs(int x, int y, int z) {
  sort_3(x, y, z);
  mark(x, y, z, -1, -1, -1, 0);
  while (!bq.empty()) {
    node t = bq.front();
    bq.pop();
    int x = t.x;
    int y = t.y;
    int z = t.z;
    sort_3(x, y, z);
    const int arr[] = {x, y, z};
    for (int k = 0; k < 3; k++) {
      int a = arr[k];
      int b = arr[(k + 1) % 3];
      int c = arr[(k + 2) % 3];
      for (int i = 0; i < n; i++) {
        if (i == a or i == b or i == c) continue;
        if (table[i][a] == table[b][c]) {
          mark(i, b, c, x, y, z, dist[x][y][z] + 1);
        }
      }
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  memset(dist, -1, sizeof dist);
  memset(par, -1, sizeof par);
  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 ch;
      cin >> ch;
      table[i][j] = ch - 'a';
      if (i == j) table[i][j] = -1;
    }
  }
  bfs(a, b, c);
  vector<node> path;
  path.push_back({0, 1, 2});
  node l = path[path.size() - 1];
  while (l.x != -1 and l.y != -1 and l.z != -1) {
    path.push_back(par[l.x][l.y][l.z]);
    l = path[path.size() - 1];
  }
  reverse(path.begin(), path.end());
  cout << dist[0][1][2] << endl;
  for (int i = 1; i < path.size() - 1; i++) {
    node p = path[i];
    node q = path[i + 1];
    pair<int, int> ans = diff(p, q);
    cout << ans.first + 1 << " " << ans.second + 1 << endl;
  }
  return 0;
}
