#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:267386880")
using namespace std;
int n;
char g[72][72];
struct pos {
  int data[3];
};
const int MAXQ = 400000;
bool used[72][72][72];
pos prv[72][72][72];
pos q[MAXQ];
int head, tail;
pair<int, int> getDiff(pos &a, pos &b) {
  int diffA(-1);
  for (int i(0); i <= ((long long)(3) - 1); ++i) {
    bool ok(true);
    for (int j(0); j <= ((long long)(3) - 1); ++j)
      if (b.data[j] == a.data[i]) ok = false;
    if (ok) {
      diffA = a.data[i];
      break;
    }
  }
  int sm1(accumulate(a.data, a.data + 3, 0));
  int sm2(accumulate(b.data, b.data + 3, 0));
  int diffB = -(sm1 - sm2 - diffA);
  return make_pair(diffA, diffB);
}
void printAns() {
  pos tmp = {{0, 1, 2}};
  pos &now = tmp;
  pos &from = prv[0][1][2];
  vector<pair<int, int> > ans;
  while (from.data[0] != -1) {
    pair<int, int> rs(getDiff(from, now));
    ans.push_back(rs);
    now = from;
    from = prv[now.data[0]][now.data[1]][now.data[2]];
  }
  reverse((ans).begin(), (ans).end());
  printf("%d\n", ((int)ans.size()));
  for (int i(0); i <= ((long long)(((int)ans.size())) - 1); ++i)
    printf("%d %d\n", ans[i].first + 1, ans[i].second + 1);
  exit(0);
}
void addPos(int a, int b, int c, pos from) {
  pos p = {{a, b, c}};
  sort(p.data, p.data + 3);
  if (used[p.data[0]][p.data[1]][p.data[2]]) return;
  used[p.data[0]][p.data[1]][p.data[2]] = true;
  prv[p.data[0]][p.data[1]][p.data[2]] = from;
  q[tail++] = p;
  if (tail == MAXQ) tail = 0;
  if (p.data[0] == 0 && p.data[1] == 1 && p.data[2] == 2) printAns();
}
bool can(int from, int to, int a, int b) { return g[a][b] == g[from][to]; }
void process() {
  pos &cur = q[head++];
  if (head == MAXQ) head = 0;
  for (int i(0); i <= ((long long)(3) - 1); ++i) {
    int from(cur.data[i]);
    int a(cur.data[(i + 1) % 3]), b(cur.data[(i + 2) % 3]);
    for (int to(0); to <= ((long long)(n)-1); ++to) {
      if (to == a || to == b || to == from) continue;
      if (can(from, to, a, b)) addPos(to, a, b, cur);
    }
  }
}
void solve() {
  scanf("%d", &n);
  int a, b, c;
  scanf("%d%d%d\n", &a, &b, &c);
  for (int i(0); i <= ((long long)(n)-1); ++i) gets(g[i]);
  pos fict = {{-1, -1, -1}};
  addPos(--a, --b, --c, fict);
  while (head != tail) process();
  printf("-1\n");
}
void bruteforce() {}
int main() {
  solve();
  bruteforce();
  return 0;
}
