/**/
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <stack>
#include <queue>

typedef long long LL;
using namespace std;

int a[55][55][55];
int T;
int n;
int A, B, C;
int vis[55][55][55];
int dist[6][3] = {0, 0, 1, 0, 0, -1, 1, 0, 0, -1, 0, 0, 0, 1, 0, 0, -1, 0};

struct node
{
	int x, y, z, step;
	// bool operator <(const node &q)const{
	// 	return step > q.step;
	// }
};

// void bfs(){
// 	memset(vis, 0, sizeof(vis));
// 	priority_queue<node> q;
// 	q.push(node{1, 1, 1, 0});
// 	vis[1][1][1] = 0;
// 	while(q.size()){
// 		node u = q.top();
// 		q.pop();
// 		if(u.x == A && u.y == B && u.z == C){
// 			if(u.step <= T){
// 				printf("%d\n", u.step);
// 			}else{
// 				printf("-1\n");
// 			}
// 			return ;
// 		}
// 		for (int i = 0; i < 6; i++){
// 			int x = u.x + dist[i][0], y = u.y + dist[i][1], z = u.z + dist[i][2];
			
// 			if(x < 1 || x > A || y < 1 || y > B || z < 1 || z > C || a[x][y][z] == 1) continue;
// 			if(!vis[x][y][z] || vis[x][y][z] > u.step + 1){
// 				vis[x][y][z] = u.step + 1;
// 				q.push(node{x, y, z, vis[x][y][z]});
// 			}
// 		}
// 	}
// 	printf("-1\n");
// }

// void bfs(){
// 	memset(vis, 0, sizeof(vis));
// 	priority_queue<node> q;
// 	q.push(node{1, 1, 1, 0});
// 	vis[1][1][1] = 1;
// 	while(q.size()){
// 		node u = q.top();
// 		q.pop();
// 		if(u.step > T){
// 			printf("-1\n");
// 			return ;
// 		}
// 		if(u.x == A && u.y == B && u.z == C){
// 			if(u.step <= T){
// 				printf("%d\n", u.step);
// 			}else{
// 				printf("-1\n");
// 			}
// 			return ;
// 		}
// 		for (int i = 0; i < 6; i++){
// 			int x = u.x + dist[i][0], y = u.y + dist[i][1], z = u.z + dist[i][2];
			
// 			if(x < 1 || x > A || y < 1 || y > B || z < 1 || z > C || a[x][y][z] == 1) continue;
// 			if(!vis[x][y][z]){
// 				vis[x][y][z] = 1;
// 				q.push(node{x, y, z, u.step + 1});
// 			}
// 		}
// 	}
// 	printf("-1\n");
// }

void bfs(){
	memset(vis, 0, sizeof(vis));
	queue<node> q;
	q.push(node{1, 1, 1, 0});
	vis[1][1][1] = 1;
	while(q.size()){
		node u = q.front();
		q.pop();
		if(u.x == A && u.y == B && u.z == C){
			if(u.step <= T){
					printf("%d\n", u.step);
			}else{
				printf("-1\n");
			}
			return ;
		}
		for (int i = 0; i < 6; i++){
			int x = u.x + dist[i][0], y = u.y + dist[i][1], z = u.z + dist[i][2];
			if(x < 1 || x > A || y < 1 || y > B || z < 1 || z > C || a[x][y][z] == 1) continue;
			if(!vis[x][y][z]){
				vis[x][y][z] = 1;
				q.push(node{x, y, z, u.step + 1});
			}
		}
	}
	printf("-1\n");
}

int main()
{
	//freopen("in.txt", "r", stdin);
	//freopen("out.txt", "w", stdout);

	scanf("%d", &n);
	while(n--){
		scanf("%d %d %d %d", &A, &B, &C, &T);
		for (int i = 1; i <= A; i++){
			for (int j = 1; j <= B; j++){
				for (int k = 1; k <= C; k++){
					scanf("%d", &a[i][j][k]);
				}
			}
		}
		bfs();
	}

	return 0;
}
/**/

想打人,优先队列过不了也是服气。