#include <iostream>
#include <map>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
#include <queue>

using namespace std;

const string res = "1112131415161700212223242526270031323334353637004142434445464700";
string str;
vector<int> pt;
map<string, bool> mpp;

class St{
public:
  int cnt;
  string st;
  vector<int> vec;

  St() {}
  St(int _cnt, string _st, vector<int> _vec): cnt(_cnt), st(_st), vec(_vec) {}
};

string conv(int n)
{
  stringstream ss;
  ss << n;

  return ss.str();
}

void func(vector<vector<int> > vec)
{
  int t;
  str = "";

  for(int i = 0; i < 4; ++i){
    str += "00";
    for(int j = 0; j < 7; ++j) str += conv(vec[i][j]);
  }

  for(int i = 0; i < 4; ++i)
    for(int j = 1; j < 8; ++j)
      if(vec[i][j-1]%10 == 1){
	t = ((int)(vec[i][j-1]/10)-1)*2*8;
	str[t] = str[i*2*8+j*2];
	str[t+1] = str[i*2*8+j*2+1];
	str[i*2*8+j*2] = '0';
	str[i*2*8+j*2+1] = '0';
	pt.push_back((i*8*2+j*2));
      }
}

int check(string s, char c1, char c2)
{
  for(int i = 0; i < 4; ++i)
    for(int j = 0, p = i*8*2; j < 8; ++j)
      if(s[p+j*2] == c1 && s[p+j*2+1] == c2) return (p+j*2);

  return 0;
}

int bfs()
{
  queue<St> que;
  que.push(St(0, str, pt));
  mpp[str] = true;
  St st;
  int p, q;
  char c1, c2;
  string s;
  vector<int> v;

  while(!que.empty()){
    st = que.front();
    que.pop();

    if(st.st == res) return st.cnt;
    for(int i = 0; i < 4; ++i){
      q = st.vec[i];
      c1 = st.st[q-2];
      c2 = (char)(st.st[q-1]+1);
      if(c2 == '8') continue;
      p = check(st.st, c1, c2);
      if(p == 0) continue;
      s = st.st;
      s[q] = c1;
      s[q+1] = c2;
      s[p] = s[p+1] = '0';
      st.vec[i] = p;
      if(!mpp[s]){
	mpp[s] = true;
	que.push(St(st.cnt+1, s, st.vec));
      }
      st.vec[i] = q;
    }
  }

  return -1;
}

int main()
{
  int n, t;
  vector<vector<int> > vec;

  while(cin>>n)
    while(n--){
      vec = vector<vector<int> >(4);
      for(int i = 0; i < 4; ++i){
	vec[i] = vector<int>(7);
	for(int j = 0; j < 7; ++j) cin >> vec[i][j];
      }
      func(vec);
      vec.clear();

      cout << bfs() << endl;
      mpp.clear();
      pt.clear();
    }

  return 0;
}