#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
#include <string.h>
using namespace std;
const int N=2005;
vector<int> e[N],a;
stack<int> s;
int stk[N],cnt=0;
int f[N][N],in[N],vis[N];
int n,flag;
void dfs(int x,int las){;
if(flag) return ;
stk[++cnt]=x;
in[x]=1; vis[x]=1;
for(auto y:e[x]) if(y^las){
if(flag) return;
if(in[y]){
for(int i=cnt;i>=1;i--){
a.push_back(stk[i]);
}
flag=1;
return;
}
dfs(y,x);
}
in[x]=0;
if(cnt>0) --cnt;
}
int ask(int x,int y){
cout<<"? "<<x<<" "<<y-n<<endl;
int s;
scanf("%d",&s);
return s;
}
void clen(){
for(int i=1;i<=2*n;++i) e[i].clear();
memset(f,0,sizeof f);
memset(in,0,sizeof in);
memset(vis,0,sizeof vis);
a.clear();
cnt=0;
flag=0;
}
void mian(){
scanf("%d",&n);
clen();
for(int i=1;i<=(n<<1);++i){
int u,v;
scanf("%d%d",&u,&v);
f[u][v+n]=f[v+n][u]=i;
e[u].push_back(v+n);
e[v+n].push_back(u);
}
for(int i=1;i<=n;++i)
if(!vis[i]) dfs(i,0);
while(a.size()>4){
int len=a.size();
int x=a[len-1],y=a[(len-1)>>1];
int r=((x-1)/n)^((y-1)/n)^1;
if(r) y=a[((len-1)>>1)-1];
if(x>y) swap(x,y);
int col;
if(f[x][y]) col=f[x][y];
else col=ask(x,y);
f[x][y]=f[y][x]=col;
int p=1;
for(int i=(len>>1)-1-r;i<len-1;++i){
int l=a[i];
int r=a[i+1];
if(f[l][r]==col){
p=0;
break;
}
}
vector<int> b;
if(!p){
b.push_back(a[len-1]);
for(int i=0;i<=(len>>1)-1-r;++i)
b.push_back(a[i]);
}
else{
for(int i=(len>>1)-1-r;i<len;++i){
b.push_back(a[i]);
}
}
swap(a,b);
}
sort(a.begin(),a.end());
printf("! %d %d %d %d",a[0],a[1],a[2]-n,a[3]-n);
cout<<endl;
string s;
cin>>s;
}
int main(){
int T; scanf("%d",&T);
while(T--) mian();
}