#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct
{
int time;
int x;
int y;
}node;
typedef struct
{node pos_mes[100];
int front,rear;
}sequeue;
sequeue *q;
int start_i,start_j,end_i,end_j,num,m,n;
char map[10][10];
int hash[10][10],dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}};
void SETNULL(sequeue *sq)
{
sq->front=99;
sq->rear=99;
}
int EMPTY(sequeue *sq)
{
if(sq->rear==sq->front)
return 1;
else
return 0;
}
int ENQUEUE(sequeue *sq,node x)
{
if(sq->front==(sq->rear+1)%100)
return 0;
else
{
sq->rear=(sq->rear+1)%100;
sq->pos_mes[sq->rear]=x;
return 1;
}
}
node DEQUEUE(sequeue *sq)
{
node Z;
Z.x=-5; Z.y=-5; Z.time=-5;
if(EMPTY(sq))
return Z;
else
{
sq->front=(sq->front+1)%100;
return (sq->pos_mes[sq->front]);
}
}
int BFS(int sx, int sy)
{
node N, P;
int i;
SETNULL(q);
N.x = sx;
N.y = sy;
N.time = 0;
hash[N.x][N.y] = 6;
ENQUEUE(q,N);
while(!EMPTY(q))
{
N=DEQUEUE(q);
for(i=0;i<4;i++)
{
P.x=N.x+dir[i][0];
P.y=N.y+dir[i][1];
P.time=N.time+1;
if(hash[N.x][N.y]<=1||P.x<0||P.x>=m||P.y<0||P.y>=n||map[P.x][P.y]=='0')
continue;
if(map[P.x][P.y]=='3')
{
printf("%d/n",P.time);
return 1;
}
if(hash[P.x][P.y]<hash[N.x][N.y]-1)
{
hash[P.x][P.y]=hash[N.x][N.y]-1;
if(map[P.x][P.y]=='4')
{
hash[P.x][P.y]=6;
}
ENQUEUE(q,P);
}
}
}
printf("-1/n");
return 1;
}
int main()
{
int T,i,j;
q=malloc(sizeof(sequeue));
scanf("%d",&T);
while(T--)
{
scanf("%d %d",&m,&n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
scanf("%s",&map[i][j]);
if(map[i][j]=='2')
{start_i=i; start_j=j;}
if(map[i][j]=='3')
{end_i=i; end_j=j;}
}
memset(hash,-1,sizeof(hash));
BFS(start_i,start_j);
}
return 0;
}