#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;   }