#include <stdio.h>
#include <cmath>
#include <algorithm>
#include <cfloat>
#include <stack>
#include <queue>
#include <vector>
#include <string>
#include <iostream>
#include <set>
#include <map>
#include <time.h>
typedef long long int ll;
typedef unsigned long long int ull;
#define BIG_NUM 2000000000
#define MOD 1000000007
#define EPS 0.000000001
using namespace std;

struct Data{
	void set(int arg_row,int arg_col){
		row = arg_row;
		col = arg_col;
	}
	int row,col;
};

struct Info{
	int table[4][8],count;
	Data sace_loc[4];
};

map<string,bool> MAP;
int ans_table[4][8];

string makeString(int table[4][8]){

	string ret;
	for(int row = 0; row < 4; row++){
		for(int col = 0; col < 8; col++){
			ret.append(to_string(table[row][col])).append(to_string('*'));
		}
	}
	return ret;
}

bool checkClear(int table[4][8]){

	for(int row = 0; row < 4; row++){
		for(int col = 0; col < 8; col++){
			if(table[row][col] != ans_table[row][col])return false;
		}
	}

	return true;
}

void copyInfo(Info& to,Info from){

	for(int row = 0; row < 4; row++){
		for(int col = 0; col < 8; col++){
			to.table[row][col] = from.table[row][col];
		}
	}

	for(int i = 0; i < 4; i++){
		to.sace_loc[i] = from.sace_loc[i];
	}
}


void func(){
	MAP.clear();

	Info first;
	first.table[0][0] = 0;
	first.table[1][0] = 0;
	first.table[2][0] = 0;
	first.table[3][0] = 0;

	for(int row = 0; row < 4; row++){
		for(int col = 1; col <= 7; col++){
			scanf("%d",&first.table[row][col]);
			switch(first.table[row][col]){
			case 11:
				first.table[0][0] = 11;
				first.table[row][col] = 0;
				first.sace_loc[0].set(row,col);
				break;
			case 21:
				first.table[1][0] = 21;
				first.table[row][col] = 0;
				first.sace_loc[1].set(row,col);
				break;
			case 31:
				first.table[2][0] = 31;
				first.table[row][col] = 0;
				first.sace_loc[2].set(row,col);
				break;
			case 41:
				first.table[3][0] = 41;
				first.table[row][col] = 0;
				first.sace_loc[3].set(row,col);
				break;
			}
		}
	}

	first.count = 0;
	string tmp = makeString(first.table);
	MAP[tmp] = true;

	queue<Info> Q;
	Q.push(first);

	int left_num,tmp_row,tmp_col;

	while(!Q.empty()){

		if(checkClear(Q.front().table)){
			printf("%d\n",Q.front().count);
			return;
		}else{

			for(int i = 0; i < 4; i++){

				left_num = Q.front().table[Q.front().sace_loc[i].row][Q.front().sace_loc[i].col-1];

				if(left_num%7 == 0){
					switch(left_num){
					case 17:
						if(Q.front().sace_loc[i].row == 0 && Q.front().sace_loc[i].col == 7)continue;
						break;
					case 27:
						if(Q.front().sace_loc[i].row == 1 && Q.front().sace_loc[i].col == 7)continue;
						break;
					case 37:
						if(Q.front().sace_loc[i].row == 2 && Q.front().sace_loc[i].col == 7)continue;
						break;
					case 47:
						if(Q.front().sace_loc[i].row == 3 && Q.front().sace_loc[i].col == 7)continue;
						break;
					}
				}

				tmp_row = -1;
				for(int row = 0; row < 4; row++){
					for(int col = 0; col < 8; col++){
						if(Q.front().table[row][col] == left_num+1){
							tmp_row = row;
							tmp_col = col;
							break;
						}
					}
					if(tmp_row != -1)break;
				}

				if(tmp_row == -1)continue;

				Info next_info;
				copyInfo(next_info,Q.front());
				next_info.table[Q.front().sace_loc[i].row][Q.front().sace_loc[i].col] = left_num+1;
				next_info.table[tmp_row][tmp_col] = 0;

				tmp = makeString(next_info.table);

				auto at = MAP.find(tmp);
				if(at != MAP.end())continue;

				MAP[tmp] = true;
				next_info.sace_loc[i].set(tmp_row,tmp_col);
				next_info.count = Q.front().count+1;
				Q.push(next_info);
			}
			Q.pop();
		}
	}

	printf("-1\n");
}

int main(){

	for(int col = 0; col <= 6; col++)ans_table[0][col] = 11+col;
	ans_table[0][7] = 0;
	for(int col = 0; col <= 6; col++)ans_table[1][col] = 21+col;
	ans_table[1][7] = 0;
	for(int col = 0; col <= 6; col++)ans_table[2][col] = 31+col;
	ans_table[2][7] = 0;
	for(int col = 0; col <= 6; col++)ans_table[3][col] = 41+col;
	ans_table[3][7] = 0;

	int case_num;
	scanf("%d",&case_num);

	for(int i = 0; i < case_num; i++)func();

}

Measured memory_bytes: 19448