#include <bits/stdc++.h> using namespace std; const int MAXN=10; struct node{ int x,y,now,step; }; int g[MAXN][MAXN]; int sx,sy,gx,gy; int dx[4]={0,0,1,-1}; int dy[4]={1,-1,0,0}; queue<node>que; int vis[MAXN][MAXN]; int n,m; int bfs(){ while(!que.empty())que.pop(); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ vis[i][j]=0; } } node a; a.x=sx;a.y=sy;a.now=6;a.step=0; que.push(a); while(!que.empty()){ node b=que.front();que.pop(); if(b.x==gx&&b.y==gy&&b.now>0){ return b.step; } if(b.now==1)continue; for(int i=0;i<4;i++){ int nx=b.x+dx[i]; int ny=b.y+dy[i]; if(nx<=0||nx>n||ny<=0||ny>m)continue; if(g[nx][ny]==0)continue; node c; c.x=nx;c.y=ny;c.step=b.step+1; if(g[nx][ny]==1||g[nx][ny]==2||g[nx][ny]==3)c.now=b.now-1; else if(g[nx][ny]==4)g[nx][ny]=0,c.now=6; que.push(c); } } return -1; } int main(){ int T; cin>>T; while(T--){ cin>>n>>m; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ cin>>g[i][j]; if(g[i][j]==2)sx=i,sy=j; else if(g[i][j]==3)gx=i,gy=j; } } cout<<bfs()<<endl; } return 0; }