//例:HDU1253
#include<bits/stdc++.h>
using namespace std;
int mm[51][51][51]; //地图
bool vis[51][51][51]; //记录数组
int dx[6]={1,-1,0,0,0,0};
int dy[6]={0,0,1,-1,0,0};
int dz[6]={0,0,0,0,1,-1};
int tx,ty,tz,ut;
bool fg;
typedef struct node{
int x,y,z; //当前坐标
int step; //到该点的最少步数
}node;
node bp; //开始点信息
void bfs(){
queue<node> q;//构造队列
node pre,cur;//上一个点pre,和当前搜索点cur
q.push(bp);
vis[1][1][1]=1;
while(!q.empty()){
pre=q.front();
q.pop();
if(pre.x==tx&&pre.y==ty&&pre.z==tz){ //终点跳出
if(pre.step<=ut){
fg=1;
printf("%d\n",pre.step);
return;
}
}
for(int i=0;i<6;i++){
cur.x=pre.x+dx[i];
cur.y=pre.y+dy[i];
cur.z=pre.z+dz[i];
cur.step=pre.step+1;
//根据搜索方向确定cur
if(cur.x<1||cur.y<1||cur.z<1)continue; //范围剪枝
if(cur.x>tx||cur.y>ty||cur.z>tz)continue; //范围剪枝
if(mm[cur.x][cur.y][cur.z]==1||vis[cur.x][cur.y][cur.z]==1)continue;
vis[cur.x][cur.y][cur.z]=1;
q.push(cur); //先走到的步数一定最少,个别有例外
}
}
}
int main()
{
int num;
scanf("%d",&num);
while(num--){
scanf("%d %d %d %d",&tx,&ty,&tz,&ut);
memset(vis,0,sizeof(vis));
for(int i=1;i<=tx;i++){
for(int j=1;j<=ty;j++){
for(int k=1;k<=tz;k++){
scanf("%d",&mm[i][j][k]);
}
}
}
fg=0;
bp.x=1;
bp.y=1;
bp.z=1;
bp.step=0;
bfs();
if(!fg){
printf("-1\n");
}
}
return 0;
}