#include <bits/stdc++.h>
using namespace std;
struct th {
  int a, b, c;
  th() {}
  th(int x, int y, int z) {
    int mn[3] = {x, y, z};
    sort(mn, mn + 3);
    a = mn[0], b = mn[1], c = mn[2];
  }
  bool operator<(const th x) const { return tie(a, b, c) < tie(x.a, x.b, x.c); }
};
const int MAXN = 100 + 10;
char c[MAXN][MAXN];
map<th, int> dist;
map<th, pair<th, pair<int, int> > > par;
vector<th> vec;
void move(int f, int g, int w, int q, th v) {
  if (c[f][g] != c[w][q]) return;
  th u(g, w, q);
  if (dist.find(u) == dist.end()) {
    vec.push_back(u);
    dist[u] = dist[v] + 1;
    par[u] = {v, {f, g}};
  }
}
int main() {
  int n, x, y, z;
  cin >> n;
  cin >> x >> y >> z;
  x--, y--, z--;
  th p(x, y, z);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> c[i][j];
  vec.push_back(p);
  dist[p] = 0;
  int ind = 0;
  while (ind < (int)vec.size()) {
    th v = vec[ind++];
    for (int i = 0; i < n; i++)
      if (i != v.a && i != v.b && i != v.c) {
        move(v.a, i, v.b, v.c, v);
        move(v.b, i, v.a, v.c, v);
        move(v.c, i, v.a, v.b, v);
      }
  }
  th lst(0, 1, 2);
  if (dist.find(lst) == dist.end()) {
    cout << -1 << endl;
    return 0;
  }
  cout << dist[lst] << endl;
  vector<pair<int, int> > ans;
  while (lst < p || p < lst) {
    ans.push_back(par[lst].second);
    lst = par[lst].first;
  }
  for (int i = (int)ans.size() - 1; i >= 0; i--)
    cout << ans[i].first + 1 << " " << ans[i].second + 1 << endl;
  return 0;
}
