#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e2;
vector<int> adj[maxn][30];
vector<pair<int, int> > ans;
pair<pair<int, int>, int> par[maxn][maxn][maxn];
char mat[maxn][maxn];
bool mark[maxn][maxn][maxn];
int n, stone[3], st[3], arr[3], brr[3], check[maxn];
void input() {
  cin >> n;
  for (int i = 0; i < 3; i++) cin >> stone[i], stone[i]--;
  sort(stone, stone + 3);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      cin >> mat[i][j];
      if (i != j)
        adj[i][mat[i][j] - 'a'].push_back(j),
            adj[j][mat[i][j] - 'a'].push_back(i);
    }
}
void bfs() {
  queue<pair<pair<int, int>, int> > q;
  q.push({{stone[0], stone[1]}, stone[2]});
  mark[stone[0]][stone[1]][stone[2]] = true;
  while (!q.empty()) {
    auto stt = q.front();
    q.pop();
    int a = stt.first.first, b = stt.first.second, c = stt.second;
    for (auto x : adj[a][mat[b][c] - 'a']) {
      st[0] = x, st[1] = b, st[2] = c;
      sort(st, st + 3);
      if (!mark[st[0]][st[1]][st[2]] && x != b && x != c) {
        mark[st[0]][st[1]][st[2]] = true;
        q.push({{st[0], st[1]}, st[2]});
        par[st[0]][st[1]][st[2]] = {{a, b}, c};
      }
    }
    for (auto x : adj[b][mat[a][c] - 'a']) {
      st[0] = a, st[1] = x, st[2] = c;
      sort(st, st + 3);
      if (!mark[st[0]][st[1]][st[2]] && x != a && x != c) {
        mark[st[0]][st[1]][st[2]] = true;
        q.push({{st[0], st[1]}, st[2]});
        par[st[0]][st[1]][st[2]] = {{a, b}, c};
      }
    }
    for (auto x : adj[c][mat[a][b] - 'a']) {
      st[0] = a, st[1] = b, st[2] = x;
      sort(st, st + 3);
      if (!mark[st[0]][st[1]][st[2]] && x != a && x != b) {
        mark[st[0]][st[1]][st[2]] = true;
        q.push({{st[0], st[1]}, st[2]});
        par[st[0]][st[1]][st[2]] = {{a, b}, c};
      }
    }
  }
}
void pp(int a, int b, int c) {
  if (stone[0] == a && stone[1] == b && stone[2] == c) return;
  auto x = par[a][b][c];
  arr[0] = x.first.first, arr[1] = x.first.second, arr[2] = x.second;
  brr[0] = a, brr[1] = b, brr[2] = c;
  for (int i = 0; i < 3; i++) check[arr[i]]++, check[brr[i]]++;
  int aa, bb;
  for (int i = 0; i < 3; i++) {
    if (check[arr[i]] == 1) aa = arr[i];
    if (check[brr[i]] == 1) bb = brr[i];
  }
  for (int i = 0; i < 3; i++) check[arr[i]]--, check[brr[i]]--;
  pp(arr[0], arr[1], arr[2]);
  ans.push_back({aa, bb});
}
void output() {
  cout << ans.size() << endl;
  for (auto x : ans) cout << x.first + 1 << " " << x.second + 1 << endl;
}
int main() {
  input();
  bfs();
  if (!mark[0][1][2]) {
    cout << -1 << endl;
    return 0;
  }
  pp(0, 1, 2);
  output();
}
