#include<bits/stdc++.h>
using namespace std;
const int N = 2000 + 10;
int T, n, vis[N];
int g[N][N];
int tp, sta[N];
char okokok[N];
vector<int> path;
bool find_path(int u, int fa){
if(vis[u]){
path.clear();
if(u <= n)
path.push_back(u);
while(sta[tp] != u)
path.push_back(sta[tp--]);
if(u > n)
path.push_back(u);
tp = 0;
return 1;
}
vis[u] = 1;
sta[++tp] = u;
for(int v=1;v<=n*2;v++){
if(v == fa || !g[u][v] || vis[v] == 2)
continue;
if(find_path(v, u))
return 1;
}
tp--;
vis[u] = 2;
return 0;
}
void solve(){
memset(g, 0, sizeof(g));
memset(vis, 0, sizeof(vis));
memset(sta, 0, sizeof(sta));
tp = 0;
scanf("%d", &n);
for(int i=1,x,y;i<=2*n;i++){
scanf("%d%d", &x, &y);
g[x][y + n] = g[y + n][x] = i;
}
for(int i=1;i<=n;i++)
if(!vis[i] && find_path(i, i))
break;
while(path.size() > 4){
int color, sz = path.size();
int s = 0, t = (sz % 4 ? sz / 2 : sz / 2 + 1);
int u = path[s], v = path[t], flag = 1;
if(u > v)
swap(u, v);
printf("? %d %d\n", u, v - n);
fflush(stdout);
scanf("%d", &color);
g[u][v - n] = g[v - n][u] = color;
vector<int> now;
for(int i=s;i<t;i++){
if(g[path[i]][path[i + 1]] == color){
flag = 0;
break;
}
}
if(flag){
for(int i=s;i<=t;i++)
now.push_back(path[i]);
}else{
now.push_back(path[s]);
for(int i=path.size()-1;i>=t;i--)
now.push_back(path[i]);
}
swap(path, now);
}
sort(path.begin(), path.end());
printf("! %d %d %d %d\n", path[0], path[1], path[2] - n, path[3] - n);
fflush(stdout);
scanf("%s", okokok);
return ;
}
int main(){
scanf("%d", &T);
while(T--)
solve();
return 0;
}