#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 100
struct queue{
int x,y,z,steps;
}que[MAX*MAX*MAX*2+1];
int map[MAX+2][MAX+2][MAX+2];
int di[][3]={1,0,0,0,1,0,0,0,1,-1,0,0,0,-1,0,0,0,-1};
int BFS();
int inmap(int ax,int by,int cz);
int a,b,c,T;
int BFS()
{
int i,j,tx,ty,tz,front=0,rear=1;
que[0].x=1,que[0].y=1,que[0].z=1,que[0].steps=0;
map[0][0][0]=1;
while(front<rear)
{
if(que[front].x == a && que[front].y== b && que[front].z== c)
{
return que[front].steps;
}
for(i=0;i<6;i++)
{
tx=que[front].x+di[i][0],ty=que[front].y+di[i][1],tz=que[front].z+di[i][2];
if(inmap(tx,ty,tz) && !map[tx][ty][tz])
{
map[tx][ty][tz]=1;
que[rear].x=tx,que[rear].y=ty,que[rear].z=tz;
que[rear++].steps=que[front].steps+1;
}
}
front++;
}
return -1;
}
int inmap(int ax,int by,int cz)
{
if(ax>0 && ax <= a && by >0 && by <=b && cz>0 && cz <= c)
return 1;
else
return 0;
}
int main()
{
int cases,judge;
int i,j,k;
scanf("%d",&cases);
while(cases--)
{
memset(map,0,sizeof(map));
scanf("%d%d%d%d",&a,&b,&c,&T);
for(i=1;i<=a;i++)
{
for(j=1;j<=b;j++)
{
for(k=1;k<=c;k++)
scanf("%d",&map[i][j][k]);
}
}
if(a+b+c-3 > T)
printf("-1\n");
else{
judge=BFS();
if(judge == -1)
printf("-1\n");
else
if(judge <= T)
printf("%d\n",judge);
else
printf("-1\n");
}
}
return 0;
}
/**************************************************************
Problem: 2234
User: admin
Language: C++
Result: Accepted
Time:41 ms
Memory:36540 kb
****************************************************************/