#include<iostream>#include<cstdio>#include<cstring>#include<queue>using namespace std;#define N 60struct node{int a,b,c;int time;}cur,next;int mark[N][N][N],n;char map[N][N];int bfs(){int i;queue<node> q;memset(mark,0,sizeof(mark));cur.time=0;mark[cur.a][cur.b][cur.c]=1;if(cur.a==cur.b && cur.b==cur.c)return 0;q.push(cur);while(!q.empty()){cur=q.front();q.pop();for(i=1;i<=n;i++){if(map[cur.a][i]==map[cur.b][cur.c] && !mark[i][cur.b][cur.c]){mark[i][cur.b][cur.c]=1;next.time=cur.time+1;next.a=i, next.b=cur.b, next.c=cur.c;if(next.a==next.b && next.b==next.c) return next.time;q.push(next);}if(map[cur.b][i]==map[cur.a][cur.c] && !mark[cur.a][i][cur.c]){mark[cur.a][i][cur.c]=1;next.time=cur.time+1;next.a=cur.a, next.b=i, next.c=cur.c;if(next.a==next.b && next.b==next.c) return next.time;q.push(next);}if(map[cur.c][i]==map[cur.b][cur.a] && !mark[cur.a][cur.b][i]){mark[cur.a][cur.b][i]=1;next.time=cur.time+1;next.a=cur.a, next.b=cur.b, next.c=i;if(next.a==next.b && next.b==next.c) return next.time;q.push(next);}}}return -1;}int main(){int i,j;while(scanf("%d",&n),n){scanf("%d%d%d",&cur.a,&cur.b,&cur.c);for(i=1;i<=n;i++){for(j=1;j<=n;j++)cin>>map[i][j];}int x=bfs();if(x!=-1) printf("%dn",x);else printf("impossiblen");}return 0;}


