#include <bits/stdc++.h>
using namespace std;
void relax(long long &a, long long &b, long long &c) {
  long long ar[3] = {a, b, c};
  sort(ar, ar + 3);
  a = ar[0];
  b = ar[1];
  c = ar[2];
}
struct trp {
  long long x, y, z, c;
  trp() { x = y = z = c = 0; }
  trp(long long a, long long b, long long cc, long long d) {
    relax(a, b, cc);
    x = a;
    y = b;
    z = cc;
    c = d;
  }
};
const long long N = 70 + 10, M = 70 * 70 * 70;
long long n, a, b, c, dis[N][N][N];
char ar[N][N];
queue<trp> que;
trp par[N][N][N];
vector<trp> ans;
bool check(long long v, long long u, long long x, long long y) {
  return ar[v][u] == ar[x][y] && u != x && u != y;
}
void add(long long x, long long y, long long z, long long c) {
  if (dis[x][y][z] < c) return;
  dis[x][y][z] = c;
  for (long long i = 0; i < n; i++) {
    if (check(x, i, y, z)) {
      long long p = i, q = y, r = z;
      relax(p, q, r);
      if (c + 1 < dis[p][q][r]) {
        dis[p][q][r] = c + 1;
        que.push(trp(p, q, r, c + 1));
        par[p][q][r] = trp(x, y, z, c);
      }
    }
    if (check(y, i, x, z)) {
      long long p = i, q = x, r = z;
      relax(p, q, r);
      if (c + 1 < dis[p][q][r]) {
        dis[p][q][r] = c + 1;
        que.push(trp(p, q, r, c + 1));
        par[p][q][r] = trp(x, y, z, c);
      }
    }
    if (check(z, i, x, y)) {
      long long p = i, q = x, r = y;
      relax(p, q, r);
      if (c + 1 < dis[p][q][r]) {
        dis[p][q][r] = c + 1;
        que.push(trp(p, q, r, c + 1));
        par[p][q][r] = trp(x, y, z, c);
      }
    }
  }
}
int32_t main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  memset(par, -1, sizeof par);
  memset(dis, 127, sizeof dis);
  cin >> n >> a >> b >> c;
  a--;
  b--;
  c--;
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < n; j++) cin >> ar[i][j];
  relax(a, b, c);
  que.push(trp(a, b, c, 0));
  while (que.size()) {
    trp tmp = que.front();
    que.pop();
    add(tmp.x, tmp.y, tmp.z, tmp.c);
  }
  if (dis[0][1][2] > (long long)1e9) return cout << -1 << endl, 0;
  long long x = 0, y = 1, z = 2;
  while (!(x == a && y == b && z == c)) {
    ans.push_back(trp(x, y, z, 0));
    trp tmp = par[x][y][z];
    x = tmp.x;
    y = tmp.y;
    z = tmp.z;
  }
  ans.push_back(trp(a, b, c, 0));
  reverse(ans.begin(), ans.end());
  cout << (long long)ans.size() - 1 << '\n';
  for (long long i = 0; i < (long long)ans.size() - 1; i++) {
    long long mv[2][3] = {{ans[i].x, ans[i].y, ans[i].z},
                          {ans[i + 1].x, ans[i + 1].y, ans[i + 1].z}};
    set<long long> del;
    for (long long z = 0; z < 3; z++)
      for (long long j = 0; j < 3; j++)
        if (mv[0][z] == mv[1][j]) del.insert(mv[0][z]);
    for (long long z = 0; z < 2; z++)
      for (long long j = 0; j < 3; j++)
        if (del.find(mv[z][j]) == del.end()) cout << mv[z][j] + 1 << ' ';
    cout << '\n';
  }
}
