/*
建立无权图:
两数间可达就连一条边;
最后求最短路即可
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 250 + 10;
const int inf = 0x3f3f3f3f;
int t,n,s,e,mp[maxn][maxn],common[maxn][10],dis[maxn],vis[maxn];
string str[maxn];
void init_()
{
memset(mp,inf,sizeof mp);
memset(common,0,sizeof common);
memset(dis,inf,sizeof dis);
memset(vis,0,sizeof vis);
}
void add_edge(int x,int y)
{
int ans = 0;
for(int i = 0 ; i < 10; i++)
{
ans += min(common[x][i],common[y][i]);
}
if (ans == 17)
{
mp[x][y] = 1;
mp[y][x] = 1;
}
}
void Dijkstra()
{
dis[s] = 0;
vis[s] = 1;
for(int i = 1; i <= n; i++)
{
if(i != s &&mp[s][i] < inf)
{
dis[i] = mp[s][i];
}
}
int min_dis,u;
while(1)
{
min_dis = inf;
for(int i= 1; i <= n ; i++)
{
if(!vis[i] && dis[i] < min_dis)
{
min_dis = dis[i];
u = i;
}
}
if(min_dis == inf)
{
return;
}
vis[u] = 1;
for(int i = 1; i <= n; i++)
{
if(!vis[i] && mp[u][i] == 1 && min_dis + mp[u][i] < dis[i])
{
dis[i] = min_dis + mp[u][i];
}
}
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
init_();
scanf("%d%d%d",&n,&s,&e);
for(int i =1; i <= n;i++)
{
cin>>str[i];
for(int j = 0; j < 20 ;j++)
{
int num = str[i][j] - '0';
common[i][num]++;
}
}
for(int i = 1; i <= n;i++)
{
for(int j = 1; j <= n;j++)
{
add_edge(i,j);
}
}
if(mp[s][e] == 1)
{
printf("1\n");
continue;
}
Dijkstra();
if(dis[e] == inf)
printf("-1\n");
else
printf("%d\n",dis[e]);
}
return 0;
}