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