#include <bits/stdc++.h>
using namespace std;
const int N = 70 + 3, M = N * N * N, INF = 1e9;
int d[M], par[M];
map<pair<int, pair<int, int> >, int> mp;
vector<pair<int, int> > out;
queue<pair<int, pair<int, int> > > q;
char a[N][N];
bool vis[M];
pair<int, int> del[M];
int n, x, y, z, t;
void relax(int &i, int &j, int &k) {
  if (j > k) swap(j, k);
  if (i > j) swap(i, j);
  if (j > k) swap(j, k);
}
pair<int, pair<int, int> > id(int i, int j, int k) {
  relax(i, j, k);
  return pair<int, pair<int, int> >(i, {j, k});
}
bool add(int i, int j, int k, int dis) {
  pair<int, pair<int, int> > v = id(i, j, k);
  if (!vis[mp[v]]) {
    q.push(v);
    d[mp[v]] = dis;
    vis[mp[v]] = true;
    return true;
  }
  return false;
}
void upd(int i, int j, int k, int dis) {
  for (int l = 0; l < n; l++)
    if (a[i][l] == a[j][k] && l != i && l != j && l != k) {
      if (add(l, j, k, dis)) {
        del[mp[id(l, j, k)]] = {i, l};
        par[mp[id(l, j, k)]] = mp[id(i, j, k)];
      }
    }
}
int main() {
  fill(d, d + N, INF);
  cin >> n >> x >> y >> z;
  x--;
  y--;
  z--;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> a[i][j];
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++)
      for (int k = j + 1; k < n; k++) mp[id(i, j, k)] = ++t;
  add(x, y, z, 0);
  while (q.size()) {
    pair<int, pair<int, int> > v = q.front();
    auto [i, o] = v;
    auto [j, k] = o;
    q.pop();
    if (v == id(0, 1, 2)) break;
    int dis = d[mp[v]];
    upd(i, j, k, dis + 1);
    upd(k, i, j, dis + 1);
    upd(j, k, i, dis + 1);
  }
  int v = mp[id(0, 1, 2)];
  if (d[v] == INF) return cout << -1, 0;
  cout << d[v] << '\n';
  while (d[v]--) {
    out.push_back(del[v]);
    v = par[v];
  }
  reverse(out.begin(), out.end());
  for (auto [v, u] : out) cout << ++v << " " << ++u << '\n';
}
