#include <bits/stdc++.h>
using namespace std;
int n;
char g[77][77];
bool vis[77 * 77 * 77];
int varr[3];
struct state {
  int id, from, to, parent;
};
void get(int val) {
  for (int i = 0; i < 3; ++i, val /= n) varr[2 - i] = val % n;
}
int get() {
  int val = 0;
  for (int i = 0; i < 3; ++i) val = val * n + varr[i];
  return val;
}
int main() {
  vector<int> src(3);
  scanf("%d", &n);
  for (int i = 0; i < 3; ++i) scanf("%d", &src[i]), --src[i];
  sort(src.begin(), src.end());
  for (int i = 0; i < n; ++i) scanf("%s", g[i]);
  vector<state> Q;
  for (int i = 0; i < 3; ++i) varr[i] = src[i];
  state cur = {get(), -1, -1, -1};
  Q.push_back(cur);
  for (int i = 0; i < 3; ++i) varr[i] = i;
  int snk = get();
  if (cur.id == snk) {
    puts("0");
    return 0;
  }
  vis[cur.id] = 1;
  int level = 0;
  int ans = -1;
  int local[3], next[3];
  for (int idx = 0; idx < (int)Q.size();) {
    int size = Q.size() - idx;
    while (size--) {
      cur = Q[idx];
      get(cur.id);
      for (int i = 0; i < 3; ++i) local[i] = varr[i];
      for (int i = 0; i < 3; ++i) {
        int u = local[i];
        int j = local[(i + 1) % 3];
        int k = local[(i + 2) % 3];
        for (int v = 0; v < n; ++v)
          if (v != j && v != k && g[u][v] == g[j][k]) {
            for (int q = 0; q < 3; ++q) next[q] = local[q];
            next[i] = v;
            sort(next, next + 3);
            for (int q = 0; q < 3; ++q) varr[q] = next[q];
            state nxt = {get(), u, v, idx};
            if (vis[nxt.id]) continue;
            vis[nxt.id] = 1;
            Q.push_back(nxt);
            if (nxt.id == snk) {
              ans = level + 1;
              goto done;
            }
          }
      }
      ++idx;
    }
    ++level;
  }
done:;
  printf("%d\n", ans);
  if (ans != -1) {
    stack<pair<int, int> > path;
    int idx = Q.size() - 1;
    while (Q[idx].parent != -1) {
      path.push(make_pair(Q[idx].from + 1, Q[idx].to + 1));
      idx = Q[idx].parent;
    }
    while (path.size())
      printf("%d %d\n", path.top().first, path.top().second), path.pop();
  }
  return 0;
}
