#include <bits/stdc++.h>
using namespace std;
const int maxn = 80;
const int mod = 1e9 + 7;
const int inf = 1e9;
int n, a, b, c, d, dis[maxn][maxn][maxn], da, db, dc;
string s[maxn];
vector<int> g[maxn][26];
vector<pair<int, int> > ans;
pair<int, pair<int, int> > p, par[maxn][maxn][maxn];
pair<int, int> op[maxn][maxn][maxn];
queue<pair<int, pair<int, int> > > q;
pair<int, pair<int, int> > fix(pair<int, pair<int, int> > x) {
  return {min(x.first, min(x.second.first, x.second.second)),
          {x.first + x.second.first + x.second.second -
               min(x.first, min(x.second.first, x.second.second)) -
               max(x.first, max(x.second.first, x.second.second)),
           max(x.first, max(x.second.first, x.second.second))}};
}
int cal(pair<int, pair<int, int> > x) {
  x = fix(x);
  return dis[x.first][x.second.first][x.second.second];
}
void se(pair<int, pair<int, int> > x, int e) {
  x = fix(x);
  dis[x.first][x.second.first][x.second.second] = e;
  return;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  ;
  cin >> n >> da >> db >> dc;
  for (int i = 0; i < n; i++) {
    cin >> s[i];
    for (int j = 0; j < n; j++) {
      if (i != j) {
        g[i][s[i][j] - 'a'].push_back(j);
      }
      for (int k = 0; k < n; k++) {
        dis[i][j][k] = inf;
      }
    }
  }
  a = --da;
  b = --db;
  c = --dc;
  if (a > b) {
    swap(a, b);
  }
  if (b > c) {
    swap(b, c);
  }
  if (a > b) {
    swap(a, b);
  }
  da = a;
  db = b;
  dc = c;
  q.push({a, {b, c}});
  dis[a][b][c] = 0;
  while (!q.empty()) {
    a = q.front().first;
    b = q.front().second.first;
    c = q.front().second.second;
    q.pop();
    for (int i = 0; i < g[a][s[b][c] - 'a'].size(); i++) {
      d = g[a][s[b][c] - 'a'][i];
      p = fix({d, {b, c}});
      if (d != a && d != b && d != c &&
          dis[p.first][p.second.first][p.second.second] > dis[a][b][c] + 1) {
        dis[p.first][p.second.first][p.second.second] = dis[a][b][c] + 1;
        par[p.first][p.second.first][p.second.second] = {a, {b, c}};
        op[p.first][p.second.first][p.second.second] = {a, d};
        q.push(p);
      }
    }
    for (int i = 0; i < g[b][s[a][c] - 'a'].size(); i++) {
      d = g[b][s[a][c] - 'a'][i];
      p = fix({d, {a, c}});
      if (d != a && d != b && d != c &&
          dis[p.first][p.second.first][p.second.second] > dis[a][b][c] + 1) {
        dis[p.first][p.second.first][p.second.second] = dis[a][b][c] + 1;
        dis[p.first][p.second.first][p.second.second] = dis[a][b][c] + 1;
        par[p.first][p.second.first][p.second.second] = {a, {b, c}};
        op[p.first][p.second.first][p.second.second] = {b, d};
        q.push(p);
      }
    }
    for (int i = 0; i < g[c][s[a][b] - 'a'].size(); i++) {
      d = g[c][s[a][b] - 'a'][i];
      p = fix({d, {a, b}});
      if (d != a && d != b && d != c &&
          dis[p.first][p.second.first][p.second.second] > dis[a][b][c] + 1) {
        dis[p.first][p.second.first][p.second.second] = dis[a][b][c] + 1;
        dis[p.first][p.second.first][p.second.second] = dis[a][b][c] + 1;
        par[p.first][p.second.first][p.second.second] = {a, {b, c}};
        op[p.first][p.second.first][p.second.second] = {c, d};
        q.push(p);
      }
    }
  }
  if (dis[0][1][2] == inf) {
    cout << -1;
    return 0;
  }
  p = {0, {1, 2}};
  while (p.first != da || p.second.first != db || p.second.second != dc) {
    ans.push_back(op[p.first][p.second.first][p.second.second]);
    p = par[p.first][p.second.first][p.second.second];
  }
  cout << dis[0][1][2] << endl;
  if (ans.size() == 0) return 0;
  for (int i = ans.size() - 1; i > -1; i--) {
    cout << ans[i].first + 1 << " " << ans[i].second + 1 << endl;
  }
  return 0;
}
