#include <bits/stdc++.h>
using namespace std;
pair<int, pair<int, int> > matrix[71][71][71];
int cost[71][71][71];
vector<string> colors;
int n;
void initialize() {
  colors.clear();
  for (int i = 0; i < 71; i++) {
    for (int j = 0; j < 71; j++) {
      for (int k = 0; k < 71; k++) {
        matrix[i][j][k] = make_pair(-1, make_pair(-1, -1));
        cost[i][j][k] = 500000;
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  int x, y, z;
  scanf("%d %d %d", &x, &y, &z);
  initialize();
  string s;
  getline(cin, s);
  for (int i = 0; i < n; i++) {
    getline(cin, s);
    colors.push_back(s);
  }
  matrix[x][y][z] = make_pair(0, make_pair(0, 0));
  queue<pair<int, pair<int, int> > > q;
  q.push(make_pair(x, make_pair(y, z)));
  cost[x][y][z] = 0;
  while (!q.empty()) {
    pair<int, pair<int, int> > elt = q.front();
    q.pop();
    x = elt.first;
    y = elt.second.first;
    z = elt.second.second;
    for (int i = 1; i <= n; i++) {
      if ((i == x) || (i == y) || (i == z)) continue;
      if (colors[x - 1][i - 1] == colors[y - 1][z - 1]) {
        if (cost[i][y][z] == 500000) {
          cost[i][y][z] = cost[x][y][z] + 1;
          matrix[i][y][z] = make_pair(x, (make_pair(y, z)));
          q.push(make_pair(i, make_pair(y, z)));
        }
      }
      if (colors[y - 1][i - 1] == colors[x - 1][z - 1]) {
        if (cost[x][i][z] == 500000) {
          cost[x][i][z] = cost[x][y][z] + 1;
          matrix[x][i][z] = make_pair(x, (make_pair(y, z)));
          q.push(make_pair(x, make_pair(i, z)));
        }
      }
      if (colors[z - 1][i - 1] == colors[y - 1][x - 1]) {
        if (cost[x][y][i] == 500000) {
          cost[x][y][i] = cost[x][y][z] + 1;
          matrix[x][y][i] = make_pair(x, (make_pair(y, z)));
          q.push(make_pair(x, make_pair(y, i)));
        }
      }
    }
  }
  int ans = cost[1][2][3];
  x = 1;
  y = 2;
  z = 3;
  if (cost[1][3][2] < ans) {
    ans = cost[1][3][2];
    x = 1;
    y = 3;
    z = 2;
  }
  if (cost[2][1][3] < ans) {
    ans = cost[2][1][3];
    x = 2;
    y = 1;
    z = 3;
  }
  if (cost[2][3][1] < ans) {
    ans = cost[2][3][1];
    x = 2;
    y = 3;
    z = 1;
  }
  if (cost[3][1][2] < ans) {
    ans = cost[3][1][2];
    x = 3;
    y = 1;
    z = 2;
  }
  if (cost[3][2][1] < ans) {
    ans = cost[3][2][1];
    x = 3;
    y = 2;
    z = 1;
  }
  if (ans == 500000) {
    cout << -1 << endl;
  } else {
    cout << ans << endl;
    pair<int, pair<int, int> > roller = make_pair(x, make_pair(y, z));
    stack<pair<int, pair<int, int> > > s;
    s.push(roller);
    for (int i = 0; i < ans; i++) {
      roller = matrix[x][y][z];
      x = roller.first;
      y = roller.second.first;
      z = roller.second.second;
      s.push(roller);
    }
    roller = s.top();
    s.pop();
    for (int i = 0; i < ans; i++) {
      pair<int, pair<int, int> > unroll = s.top();
      s.pop();
      if (roller.first != unroll.first) {
        cout << roller.first << " " << unroll.first << endl;
      } else if (roller.second.first != unroll.second.first) {
        cout << roller.second.first << " " << unroll.second.first << endl;
      } else {
        cout << roller.second.second << " " << unroll.second.second << endl;
      }
      roller = unroll;
    }
  }
  return 0;
}
