#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
char c;
int ton[maxn];
int t,a[10][10],idx,idy;
int g[10][10],num;
const int dx[]={1,1,-1,-1,2,2,-2,-2};
const int dy[]={2,-2,2,-2,1,-1,1,-1};
int f,ans;
int js(){
int h=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(a[i][j]!=g[i][j])h++;
}
}
return h;
}
int check(){
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
if(a[i][j]!=g[i][j]){
return 0;
}
}
}
return 1;
}
int hash_(){
int k=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
k+=(a[i][j]+101)*i*(j+7)+(a[i][j]+311)*i+(a[i][j]+2)*j+(a[i][j]+207)*(i+j)+(a[i][j]+11)*(a[i][j]+11)*(i*i)*j;
}
}
return k;
}
void dfs(int x,int y,int dep,int lim){
if(dep==lim){
if(check()){
ans=dep;
f=1;
}
return;
}
for(int i=0;i<8;i++){
int nx=x+dx[i],ny=y+dy[i];
if(nx<1||nx>5||ny<1||ny>5)continue;
swap(a[x][y],a[nx][ny]);
num=hash_();
if(ton[num]<=dep-1){
swap(a[x][y],a[nx][ny]);
continue;
}
int q=ton[num];
ton[num]=dep+1;
if(dep+js()<=lim)dfs(nx,ny,dep+1,lim);
ton[num]=q;
swap(a[x][y],a[nx][ny]);
}
return;
}
int main(){
for(int i=1;i<=5;i++){
g[1][i]=1;g[5][i]=0;
}
for(int i=1;i<=4;i++){
g[4][i]=0;g[2][6-i]=1;
}
g[2][1]=0;g[4][5]=1;
g[3][1]=g[3][2]=0;g[3][4]=g[3][5]=1;
g[3][3]=2;
cin>>t;
while(t--){
memset(a,0,sizeof(a));
for(int i=1;i<=maxn;i++){
ton[i]=INT_MAX;
}
f=0;
for(int i=1;i<=5;i++){
for(int j=1;j<=5;j++){
cin>>c;
if(c=='1')a[i][j]=1;
else if(c=='0')a[i][j]=0;
else{
a[i][j]=2;
idx=i;idy=j;
}
}
}
num=hash_();
ton[num]=0;
for(int i=1;i<=15;i++){
dfs(idx,idy,0,i);
if(f==1){
cout<<ans<<endl;
break;
}
}
if(f==0)cout<<-1<<endl;
}
return 0;
}