//这个题首先要对应好关系,题目中是竖着放的,而我们输入的时候是横着的,所以z对应a,x对应b,y对应c
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int a,b,c,t;
int s[55][55][55];
int biao[55][55][55];
int dis[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};//六种情况
struct node
{
int x,y,z;
};
void bfs(int q,int w,int e)
{
memset(biao,0,sizeof(biao));
queue<node>p;
node o;
o.x=q;
o.y=w;
o.z=e;
p.push(o);
biao[q][w][e]=1;//这个数组有两个意思,一个是标记,另一个是记时间。
while(!p.empty())
{
o=p.front();
p.pop();
for(int i=0;i<6;i++)
{
node f;
f.x=o.x+dis[i][0];
f.y=o.y+dis[i][1];
f.z=o.z+dis[i][2];
if(f.x<0||f.y<0||f.z<0||f.x>=b||f.y>=c||f.z>=a||s[f.z][f.x][f.y]||biao[f.x][f.y][f.z])//当满足出界,标记不为0,路为1的时候,就continue
continue;
p.push(f);
biao[f.x][f.y][f.z]=biao[o.x][o.y][o.z]+1;
}
}
}
int main()
{
int i,j,k,r;
scanf("%d",&r);
while(r--)
{
scanf("%d%d%d%d",&a,&b,&c,&t);
for(i=0;i<a;i++)
for(j=0;j<b;j++)
for(k=0;k<c;k++)
scanf("%d",&s[i][j][k]);
bfs(0,0,0);
if(biao[b-1][c-1][a-1]>t)
printf("-1\n");
else
printf("%d\n",biao[b-1][c-1][a-1]-1);//因为一开始标记了这个数组为1,所以最后输出时要减去1
}
return 0;
}