#include <iostream>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <set>
using namespace std;

const int W = 8;
const int H = 4;

int dat[4][8];

struct S {
  char dat[4][8];
  char pos[4];
  int cost;
  void show() const {
    for(int i = 0; i < H; ++i) {
      for(int j = 0; j < W; ++j) {
	cout << (int)dat[i][j] << " ";
      }
      cout << endl;
    }
  }

  void change(int sp, int a) {
    for(int i = 0; i < H; ++i) {
      for(int j = 0; j < W; ++j) {
	if(dat[i][j] == a) {
	  swap(dat[i][j], dat[pos[sp]/W][pos[sp]%W]);
	  pos[sp] = (char)(i*W+j);
	  return;
	}
      }
    }
  }

  bool operator <(const S &s) const {
    for(int i = 0; i < H; ++i) {
      for(int j = 0; j < W; ++j) {
	if(dat[i][j] != s.dat[i][j]) return dat[i][j] < s.dat[i][j];
      }
    }
    return false;
  }
};

bool isCorrect(const S &s) {
  for(int i = 0; i < H; ++i) {
    for(int j = 0; j < W; ++j) {
      if(j+1 == W) {
	if(s.dat[i][j]%10 != 8) return false;
      } else {
	if(s.dat[i][j] != (char)((i+1)*10+j+1)) return false;
      }
    }
  }
  return true;
}

int bfs(S s) {
  queue<S> que;
  set<S> vis;
  que.push(s);
  vis.insert(s);
  while(!que.empty()) {
    s = que.front(), que.pop();
    bool isChange = false;
    for(int i = 0; i < 4; ++i) {
      int x = s.pos[i]%W;
      int y = s.pos[i]/W;
      if(s.dat[y][x-1]%10 >= 7) continue;
      S t = s;
      ++t.cost;
      t.change(i, s.dat[y][x-1]+1);
      if(vis.find(t) != vis.end()) continue;
      isChange = true;
      vis.insert(t);
      que.push(t);
    }
    if(!isChange) {
      if(isCorrect(s)) return s.cost;
    }
  }
  return -1;
}

int main() {
  int T;
  cin >> T;
  while(T--) {
    S s;
    s.cost = 0;
    for(int i = 0; i < 4; ++i) {
      s.dat[i][0] = (char)((i+1)*10+8);
      s.pos[i] = (char)(i*W);
    }
    for(int i = 0; i < H; ++i) {
      for(int j = 1; j < W; ++j) {
	int in;
	cin >> in;
	s.dat[i][j] = in;
	if(in%10 == 1) {
	  char tmp = s.pos[in/10-1];
	  s.pos[in/10-1] = (char)(i*W+j);
	  swap(s.dat[i][j], s.dat[tmp/W][tmp%W]);
	}
      }
    }
    cout << bfs(s) << endl;
  }
  return 0;
}