#include <iostream.h>
//using namespace std;

const int MAXDIM = 30;

struct dominion {
	int id;
	bool inEmpire;
	bool visited;
	int up, down, left, right, front, back;
} empire[MAXDIM*MAXDIM*MAXDIM];

int found(int i)
{
	if ((i==-1) || (!empire[i].inEmpire) || empire[i].visited)
		return 0;
	int sum = 1;
	empire[i].visited = true;
	sum += found(empire[i].front);
	sum += found(empire[i].back);
	sum += found(empire[i].left);
	sum += found(empire[i].right);
	sum += found(empire[i].down);
	sum += found(empire[i].up);
	return sum;
}

bool disconnected(int n, int m, int k, int size)
{
	int start;
        int i;
	for(i=0; i<n*m*k; i++) {
		if (empire[i].inEmpire) {
			start = i;
			empire[i].visited = false;
		}
	}
	int *queue = new int[size];
	queue[0] = start;
	int front = 0, back = 1;
	empire[queue[front]].visited = true;
	while (front != back) {
		i = empire[queue[front]].front;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		i = empire[queue[front]].back;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		i = empire[queue[front]].right;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		i = empire[queue[front]].left;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		i = empire[queue[front]].up;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		i = empire[queue[front]].down;
		if ((i!=-1) && (empire[i].inEmpire) && !empire[i].visited) {
			queue[back++] = i;
			empire[i].visited = true;
		}
		front++;
	}
	delete [] queue;
	return (front != size);
}

void main()
{
	int n, m, k, l;
	int ncases;
	cin >> ncases;
	for(int icase = 1; icase <= ncases; icase++) {
		cin >> n >> m >> k >> l;

		int i, j;
		int id = 0;
		for(i=0; i<n*m*k; i++) {
			empire[i].id = id;
			empire[i].inEmpire = true;
			if (id % n != 0)
				empire[i].front = id-1;
			else
				empire[i].front = -1;
			if (id % n != n-1)
				empire[i].back = id+1;
			else
				empire[i].back = -1;
			if (id % (n*m) > n-1)
				empire[i].left = id-n;
			else
				empire[i].left = -1;
			if (id % (n*m) < n*(m-1))
				empire[i].right = id+n;
			else
				empire[i].right = -1;
			if (id > n*m-1)
				empire[i].down = id-n*m;
			else
				empire[i].down = -1;
			if (id < n*m*(k-1))
				empire[i].up = id+n*m;
			else
				empire[i].up = -1;
			id++;
		}

		int months = 0;
		int numDoms = n*m*k;
		for(i=0; i<l; i++) {
			int size;
			cin >> size;
			for(j=0; j<size; j++) {
				int d;
				cin >> d;
				empire[d].inEmpire = false;
				numDoms--;
			}
			if (numDoms == 0)
				break;
			if (disconnected(n, m, k, numDoms))
				months++;
		}
		cout << months << endl;
	}
}


				
