/*
 * POJ 2046: Gap
 * ?¢?????????????4?\?1???7?????????????????¨4???8????????????????????°?°?1????????????????????¨?¬¬???????????¶???????¬???????????????????????°?????????§????±?????????????????????§??????????????¨????????\???????????????????±???¨??¨????????????????°?????????\??°???
 * ?±???????BFS
 * ?????????????????¶?????????????¬?????????¨set??????????????????????????¶?????????4????????????????????\???????????°???????????????????????¨????°????????????¬?§????
 */

#include <cstdio>
#include <string>
#include <cstring>
#include <queue>
#include <vector>
#include <set>
#include <unordered_set>

using namespace std;


unordered_set<string> ss;

struct S {
  string s;
  int p[29];
  int b[4];
  int d;

  S() {}

  S(const string &t) : s(t), d(0) {
    int cnt = 0;
    for (int i = 0; i < 32; ++i) {
      if (s[i] == 30) {
        b[cnt++] = i;
      } else {
        p[s[i]] = i;
      }
    }
  }

  S(const S &st) : s(st.s), d(st.d) {
    memcpy(p, st.p, sizeof(p));
    memcpy(b, st.b, sizeof(b));
  }

  bool operator<(const S &st) const {
    return d > st.d;
  }
};

priority_queue<S> pq;


int main() {
  string target(32, ' ');
  int cnt = 0;
  for (int i = 0; i < 4; ++i) {
    for (int j = 1; j <= 7; ++j) {
      target[cnt++] = char(7 * i + j);
    }
    target[cnt++] = char(30);
  }

  int T;
  scanf("%d", &T);
  while (T--) {
    ss.clear();
    while (!pq.empty()) pq.pop();
    cnt = 0;
    string s(32, ' ');
    for (int i = 0; i < 4; ++i) {
      s[cnt++] = char(i * 7 + 1);
      for (int j = 0; j < 7; ++j) {
        int x;
        scanf("%d", &x);
        if (x % 10 == 1) {
          s[cnt++] = char(30);
        } else {
          s[cnt++] = char((x / 10 - 1) * 7 + x % 10);
        }
      }
    }
//    for (int i = 0; i < 32; ++i) printf("%d ", s[i]);printf("\n");

    if (s == target) {
      printf("0\n");
      continue;
    }
    pq.push(S(s));
    int ans = -1;
    while (!pq.empty()) {
      S u(pq.top());
      pq.pop();
      for (int i = 0; i < 4; ++i) {
        int bp = u.b[i];
        char pre = u.s[bp - 1];
        if (pre == 30 || pre % 7 == 0) {
          continue;
        }
        int np = u.p[pre + 1];

        S v(u);
        v.s[bp] = char(pre + 1);
        v.s[np] = char(30);
        if (ss.find(v.s) == ss.end()) {
          ++v.d;
          if (v.s == target) {
//            for (int i = 0; i < 32; ++i) printf("%d ", u.s[i]);
//            printf("---d=%d\n", u.d);
            ans = v.d;
            goto L;
          }
          ss.insert(v.s);
          v.p[pre + 1] = bp;
          v.b[i] = np;
          pq.push(v);
        }
      }
    }
    L:
    printf("%d\n", ans);
  }
  return 0;
}