#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
using namespace std;
#define hash_mod 1000003
struct state {
char g[6][6];
unsigned int hash() {
unsigned int a = 63689, b = 378551;
unsigned int value = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
value = value * a + g[i][j];
a *= b;
}
}
return value % hash_mod;
}
bool operator<(const state &a) const {
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (g[i][j] != a.g[i][j])
return g[i][j] < a.g[i][j];
}
}
return false;
}
void print() {
for (int i = 0; i < 6; i++, puts(""))
for (int j = 0; j < 6; j++)
printf("%c", g[i][j]);
puts("--");
}
};
void color(state &s, int x, int y, int w, int h, char c) {
for (int i = x; i < x + w; i++)
for (int j = y; j < y + h; j++)
s.g[i][j] = c;
}
map<state, int> hash[hash_mod];
state shiftup(state &u, int x, int y) {
state v = u;
char c = v.g[x][y];
for (int i = 0; x+i < 6 && v.g[x+i][y] == c; i++)
swap(v.g[x+i-1][y], v.g[x+i][y]);
return v;
}
state shiftdown(state &u, int x, int y) {
state v = u;
char c = v.g[x][y];
for (int i = 0; x+i >= 0 && v.g[x+i][y] == c; i--)
swap(v.g[x+i+1][y], v.g[x+i][y]);
return v;
}
state shiftleft(state &u, int x, int y) {
state v = u;
char c = v.g[x][y];
for (int i = 0; y+i < 6 && v.g[x][y+i] == c; i++)
swap(v.g[x][y+i-1], v.g[x][y+i]);
return v;
}
state shiftright(state &u, int x, int y) {
state v = u;
char c = v.g[x][y];
for (int i = 0; y+i >= 0 && v.g[x][y+i] == c; i--)
swap(v.g[x][y+i+1], v.g[x][y+i]);
return v;
}
int bfs(state init) {
for (int i = 0; i < hash_mod; i++)
hash[i].clear();
int h = init.hash(), ti, tj;
state u, v;
queue<state> Q;
Q.push(init), hash[h][init] = 0;
while (!Q.empty()) {
u = Q.front(), Q.pop();
h = u.hash();
int step = hash[h][u];
if (u.g[2][4] == 'w' && u.g[2][5] == 'w') {
return step;
}
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
if (u.g[i][j] < 'a' || u.g[i][j] > 'z')
continue;
ti = i, tj = j;
v = u;
while (ti-1 >= 0 && v.g[ti-1][tj] == ' ' && ti+1 < 6 && v.g[ti][tj] == v.g[ti+1][tj]) {
v = shiftup(v, ti, tj);
ti--;
h = v.hash();
if (hash[h].find(v) == hash[h].end()) {
hash[h][v] = step+1;
Q.push(v);
}
}
ti = i, tj = j;
v = u;
while (ti-1 >= 0 && v.g[ti-1][tj] == v.g[ti][tj] && ti+1 < 6 && v.g[ti+1][tj] == ' ') {
v = shiftdown(v, ti, tj);
ti++;
h = v.hash();
if (hash[h].find(v) == hash[h].end()) {
hash[h][v] = step+1;
Q.push(v);
}
}
ti = i, tj = j;
v = u;
while (tj-1 >= 0 && v.g[ti][tj-1] == ' ' && tj+1 < 6 && v.g[ti][tj] == v.g[ti][tj+1]) {
v = shiftleft(v, ti, tj);
tj--;
h = v.hash();
if (hash[h].find(v) == hash[h].end()) {
hash[h][v] = step+1;
Q.push(v);
}
}
ti = i, tj = j;
v = u;
while (tj-1 >= 0 && v.g[ti][tj-1] == v.g[ti][tj] && tj+1 < 6 && v.g[ti][tj+1] == ' ') {
v = shiftright(v, ti, tj);
tj++;
h = v.hash();
if (hash[h].find(v) == hash[h].end()) {
hash[h][v] = step+1;
Q.push(v);
}
}
}
}
}
return -1;
}
int main() {
int testcase, cases = 0;
int wx, wy, n, x, y;
scanf("%d", &testcase);
while (testcase--) {
state init;
char label = 'a';
memset(init.g, ' ', sizeof(init.g));
scanf("%d %d", &wx, &wy);
color(init, wx, wy, 1, 2, 'w');
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &x, &y);
color(init, x, y, 2, 1, label);
label++;
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &x, &y);
color(init, x, y, 3, 1, label);
label++;
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &x, &y);
color(init, x, y, 1, 2, label);
label++;
}
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d %d", &x, &y);
color(init, x, y, 1, 3, label);
label++;
}
int ret = bfs(init);
printf("The minimal number of moves to solve puzzle %d is %d.\n", ++cases, ret);
}
return 0;
}