#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <numeric>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <climits>
using namespace std;

typedef istringstream ISS;
typedef ostringstream OSS;
typedef vector<string> VS;
typedef vector<int> VI;
typedef vector<VI> VVI;
template<class T> T gcd( T a, T b ) {
	return !b ? a : gcd( b, a % b );
}
template<class T> T lcm( T a, T b ) {
	return a / gcd( a, b ) * b;
}
template<class T> string print_v( vector<T> v ) {
	OSS oss;
	for ( typename vector<T>::iterator it_i = v.begin(); it_i != v.end();
          ++it_i ) {
		oss << *it_i << ", ";
	}
	return oss.str();
}

const int NONE = -1;

// 1ツづつづ?づ?つサツつアツづ可禿シツづゥツづ猟つォツ要ツ素ツつェツつ?づゥツ凝ウツつ「ツづ?づゥツセツδ仰つェツつ?づ?つスツづァ
// ツつサツつアツづ可つサツづ個要ツ素ツづーツ禿シツづェツづゥ
// 1ツづつづ?個ゥツづつつゥツづァツづ按つゥツづ?つスツ湘ェツ債?づ債、ツ催?渉可づ可個ゥツづつつゥツづ?つス
// ツ暗。ツつ、ツ湘ェツ渉環づ可置ツつ「ツづ?つ?づゥツ要ツ素ツづーツ右ツ端ツづ可篠敖づ?づ?つ「ツつュ

bool check( VVI& T ) {
    for ( int i = 0; i < 4; ++ i ) {
        for ( int j = 0; j < 7; ++ j ) {
            if ( T[i][j] != ( i + 1 ) * 10 + j + 1 ) return false;
        }
    }
    for ( int i = 0; i < 4; ++ i ) {
        if ( T[i][7] != NONE ) return false;
    }
    return true;
}

typedef pair <int, VVI> NODE;
typedef queue <NODE> QUEUE;

void print( VVI T ) {
    for ( int i = 0; i < 4; ++ i ) {
        for ( int j = 0; j < 8; ++ j ) {
            cout << T[i][j] << ",";
        }
        cout << endl;
    }
    cout << endl;
}

int solve( VVI T ) {
    QUEUE Q;
    Q.push( NODE( 0, T ) );
    set <VVI> H;
    H.insert( T );

    while ( ! Q.empty() ) {
        NODE node = Q.front();
        Q.pop();

        int step = node.first;
        VVI table = node.second;

        // cout << "test: " << endl;
        // print( table );

        if ( check( table ) ) return step;

        for ( int r = 0; r < 4; ++ r ) {
            for ( int c = 1; c < 8; ++ c ) {
                if ( table[r][c] != NONE ) continue;
                for ( int i = 0; i < 4; ++ i ) {
                    for ( int j = 1; j < 8; ++ j ) {
                        if ( table[r][c-1] + 1 != table[i][j] ) continue;
                        VVI to = table;
                        to[r][c] = table[i][j];
                        to[i][j] = NONE;
                        if ( H.count( to ) ) goto out;
                        H.insert( to );
                        Q.push( NODE( step + 1, to ) );
                        if ( table[r][c-1] + 1 == table[i][j] ) goto out;
                    }
                }
            out:;
            }
        }
    }
    
    return -1;
}

int main() {
    int n;
    cin >> n;
    for ( int lpc = 0; lpc < n; ++ lpc ) {
        VVI T( 4, VI( 8, NONE ) );
        for ( int i = 0; i < 4; ++ i ) {
            for ( int j = 0; j < 7; ++ j ) {
                cin >> T[i][j+1];
                if ( T[i][j+1] % 10 == 1 ) {
                    T[i][j+1] = NONE;
                }
            }
        }
        for ( int i = 0; i < 4; ++ i ) {
            T[i][0] = 10 * ( i + 1 ) + 1;
        }
        cout << solve( T ) << endl;
    }
    return 0;
}