#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 7e1 + 7, MAX_C = 3e1 + 3;
int n, a, b, c;
int dis[MAX_N][MAX_N][MAX_N];
pair<int, int> par[MAX_N][MAX_N][MAX_N];
string table[MAX_N];
vector<int> go[MAX_N][MAX_C];
vector<pair<int, int> > ans;
priority_queue<pair<int, pair<pair<int, int>, int> >,
               vector<pair<int, pair<pair<int, int>, int> > >,
               greater<pair<int, pair<pair<int, int>, int> > > >
    PQ;
int one(int a, int b, int c) { return min({a, b, c}); }
int two(int a, int b, int c) {
  if (min({a, b, c}) == a) return min(b, c);
  if (min(b, c) == b) return min(a, c);
  return min(a, b);
}
int three(int a, int b, int c) { return max({a, b, c}); }
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n >> a >> b >> c;
  a--, b--, c--;
  for (int i = 0; i < n; i++) {
    cin >> table[i];
    for (int j = 0; j < n; j++)
      if (i != j) go[i][table[i][j] - 'a'].push_back(j);
  }
  memset(dis, 127, sizeof dis);
  dis[one(a, b, c)][two(a, b, c)][three(a, b, c)] = 0;
  PQ.push({0, {{one(a, b, c), two(a, b, c)}, three(a, b, c)}});
  while (PQ.size() && dis[0][1][2] == dis[MAX_N - 1][0][0]) {
    int A, B, C;
    A = PQ.top().second.first.first;
    B = PQ.top().second.first.second;
    C = PQ.top().second.second;
    PQ.pop();
    for (int u : go[A][table[B][C] - 'a'])
      if (u != B && u != C &&
          1 + dis[A][B][C] < dis[one(u, B, C)][two(u, B, C)][three(u, B, C)]) {
        par[one(u, B, C)][two(u, B, C)][three(u, B, C)] = {u, A};
        dis[one(u, B, C)][two(u, B, C)][three(u, B, C)] = 1 + dis[A][B][C];
        PQ.push({dis[one(u, B, C)][two(u, B, C)][three(u, B, C)],
                 {{one(u, B, C), two(u, B, C)}, three(u, B, C)}});
      }
    for (int u : go[B][table[A][C] - 'a'])
      if (u != A && u != C &&
          1 + dis[A][B][C] < dis[one(u, A, C)][two(u, A, C)][three(u, A, C)]) {
        par[one(u, A, C)][two(u, A, C)][three(u, A, C)] = {u, B};
        dis[one(u, A, C)][two(u, A, C)][three(u, A, C)] = 1 + dis[A][B][C];
        PQ.push({dis[one(u, A, C)][two(u, A, C)][three(u, A, C)],
                 {{one(u, A, C), two(u, A, C)}, three(u, A, C)}});
      }
    for (int u : go[C][table[A][B] - 'a'])
      if (u != A && u != B &&
          1 + dis[A][B][C] < dis[one(u, A, B)][two(u, A, B)][three(u, A, B)]) {
        par[one(u, A, B)][two(u, A, B)][three(u, A, B)] = {u, C};
        dis[one(u, A, B)][two(u, A, B)][three(u, A, B)] = 1 + dis[A][B][C];
        PQ.push({dis[one(u, A, B)][two(u, A, B)][three(u, A, B)],
                 {{one(u, A, B), two(u, A, B)}, three(u, A, B)}});
      }
  }
  if (dis[0][1][2] == dis[MAX_N - 1][0][0])
    cout << "-1\n";
  else {
    int A = 0, B = 1, C = 2;
    while (A != one(a, b, c) || B != two(a, b, c) || C != three(a, b, c)) {
      pair<int, int> p = par[A][B][C];
      if (p.first == A) {
        ans.push_back({p.second + 1, A + 1});
        A = p.second;
      }
      if (p.first == B) {
        ans.push_back({p.second + 1, B + 1});
        B = p.second;
      }
      if (p.first == C) {
        ans.push_back({p.second + 1, C + 1});
        C = p.second;
      }
      int Ap = A, Bp = B, Cp = C;
      A = one(Ap, Bp, Cp);
      B = two(Ap, Bp, Cp);
      C = three(Ap, Bp, Cp);
    }
    cout << ans.size() << "\n";
    reverse(ans.begin(), ans.end());
    for (pair<int, int> p : ans) cout << p.first << " " << p.second << "\n";
  }
  return 0;
}
