#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int n,ok,p1,p2,p3; int ans[51][51][51]; char map[51][51]; struct Hike{ char a,b,c; }; void bfs() { int i,a,b,c; queue<Hike>Q; Hike tmp; ans[p1][p2][p3] = 0; tmp.a = p1; tmp.b = p2; tmp.c = p3; Q.push(tmp); while(!Q.empty()) { tmp = Q.front(); Q.pop(); a = tmp.a; b = tmp.b; c = tmp.c; if((a == b) && (a == c)) { ok = a; break; } int current = ans[a][b][c]; current ++; char *color ; char bcColor = map[b][c]; color = map[a]+1; for(i=1;i<=n;i++,color++) { if(i != a && *color == bcColor && ans[i][b][c] > current) { ans[i][b][c] = current; tmp.a = i; tmp.b = b; tmp.c = c; Q.push(tmp); } } char acColor = map[a][c]; color = map[b] + 1; for(i=1;i<=n;i++,color++) { if(i != b && *color == acColor && ans[a][i][c] > current) { ans[a][i][c] = current; tmp.a = a; tmp.b = i; tmp.c = c; Q.push(tmp); } } char abColor = map[a][b]; color = map[c] + 1; for(i=1;i<=n;i++,color++) { if(i != c && *color == abColor && ans[a][b][i] > current) { ans[a][b][i] = current; tmp.a = a; tmp.b = b; tmp.c = i; Q.push(tmp); } } } } int main() { int i,j; char str[110]; while(scanf("%d",&n)!=EOF && n) { scanf("%d%d%d\n",&p1,&p2,&p3); for(i=1;i<=n;i++) { gets(str); for(j=0;j<n;j++) sscanf(str+2*j,"%c",&map[i][j+1]); map[i][n+1] = '\0'; } ok = 0; fill(&ans[0][0][0],&ans[0][0][0]+51*51*51,255); bfs(); if(ok) printf("%d\n",ans[ok][ok][ok]); else printf("impossible\n"); } return 0; }