// Time 0ms, Memory 356K
#include<iostream> #include<cstdio> #include<queue> using namespace std; int n,m,p[9][9],sx,sy,dx[]={0,1,0,-1},dy[]={1,0,-1,0}; struct point { int x,y,time,step; point(int x=0,int y=0,int time=0,int step=0):x(x),y(y),time(time),step(step){} }; int bfs() { point s(sx,sy,6,0),t; queue<point>q; int nx,ny,i; q.push(s); while(!q.empty()) { s=q.front();q.pop(); for(i=0;i<4;i++) { nx=s.x+dx[i];ny=s.y+dy[i]; t=point(nx,ny,s.time-1,s.step+1); if(t.x<0 || t.x>=n || t.y<0 || t.y>=m || !p[nx][ny] || t.time==0) continue; if(p[nx][ny]==3) return t.step; if(p[nx][ny]==4) { t.time=6;p[nx][ny]=0; } q.push(t); } } return -1; } int main() { int i,j,c; cin>>c; while(c--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%d",&p[i][j]); if(p[i][j]==2) { sx=i;sy=j;p[i][j]=0; } } } printf("%d\n",bfs()); } return 0; }