#include <bits/stdc++.h>
using namespace std;
const long long md = 1e9 + 7;
string bin(long long n) {
  string ans = "";
  while (n > 0) {
    if (n % 2 == 0)
      ans = '0' + ans;
    else
      ans = '1' + ans;
    n /= 2;
  }
  return ans;
}
long long gcd(long long a, long long b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
long long lcm(long long a, long long b) { return a * b / gcd(a, b); }
long long pmd(long long a, long long b) {
  if (b == 1) return (a + md) % md;
  if (b % 2 == 0)
    return (pmd(a * a, b / 2) + md) % md;
  else
    return (a * pmd(a * a, b / 2) + md) % md;
}
const int xn = 7e1 + 10;
const int xm = 1e2 + 10;
map<pair<pair<int, int>, int>, pair<pair<int, int>, int> > mp;
map<pair<pair<int, int>, int>, pair<int, int> > ans;
map<pair<pair<int, int>, int>, int> m;
vector<pair<int, int> > vec;
char a[xn][xn];
pair<pair<int, int>, int> srt(pair<pair<int, int>, int> g) {
  int sm = g.first.first + g.first.second + g.second;
  pair<pair<int, int>, int> ns;
  int mn = g.first.first;
  mn = min(mn, g.first.second);
  mn = min(mn, g.second);
  int mx = g.first.first;
  mx = max(mx, g.first.second);
  mx = max(mx, g.second);
  ns.first.first = mn, ns.second = mx, ns.first.second = sm - (mn + mx);
  return ns;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  ;
  int n;
  cin >> n;
  int s1, s2, s3;
  cin >> s1 >> s2 >> s3;
  for (int i = 1; i <= n; i++) {
    string g;
    cin >> g;
    for (int j = 1; j <= n; j++) a[i][j] = g[j - 1];
  }
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++)
      for (int k = j + 1; k <= n; k++) m[{{i, j}, k}] = -1;
  queue<pair<pair<int, int>, int> > q;
  q.push(srt({{s1, s2}, s3}));
  m[srt({{s1, s2}, s3})] = 0;
  while (q.size()) {
    int v = q.front().first.first, u = q.front().first.second,
        s = q.front().second;
    q.pop();
    for (int i = 1; i <= n; i++) {
      if (i == v || i == u || i == s) continue;
      if (a[v][i] == a[u][s] && m[srt({{i, u}, s})] == -1)
        q.push(srt({{i, u}, s})),
            mp[srt({{i, u}, s})] = {{v, u}, s}, ans[srt({{i, u}, s})] = {v, i},
                            m[srt({{i, u}, s})] = m[{{v, u}, s}] + 1;
    }
    for (int i = 1; i <= n; i++) {
      if (i == v || i == u || i == s) continue;
      if (a[u][i] == a[v][s] && m[srt({{i, v}, s})] == -1)
        q.push(srt({{i, v}, s})),
            mp[srt({{i, v}, s})] = {{v, u}, s}, ans[srt({{i, v}, s})] = {u, i},
                            m[srt({{i, v}, s})] = m[{{v, u}, s}] + 1;
    }
    for (int i = 1; i <= n; i++) {
      if (i == v || i == u || i == s) continue;
      if (a[s][i] == a[u][v] && m[srt({{i, u}, v})] == -1)
        q.push(srt({{i, u}, v})),
            mp[srt({{i, u}, v})] = {{v, u}, s}, ans[srt({{i, u}, v})] = {s, i},
                            m[srt({{i, u}, v})] = m[{{v, u}, s}] + 1;
    }
  }
  if (m[{{1, 2}, 3}] == -1) {
    cout << -1 << '\n';
    return 0;
  }
  pair<pair<int, int>, int> d;
  d = {{1, 2}, 3};
  cout << m[{{1, 2}, 3}] << '\n';
  while (m[srt(d)] > 0) {
    vec.push_back(ans[srt(d)]);
    d = srt(mp[srt(d)]);
  }
  for (int i = vec.size() - 1; i >= 0; i--)
    cout << vec[i].first << ' ' << vec[i].second << '\n';
  return 0;
}
