#include <bits/stdc++.h>
using namespace std;
int N;
mt19937 rng(1234);
map<array<int,3>,set<array<int,2>>>mem;
set<array<int,2>> query(int x, int y, int z){
if(max({x,y,z})>=N||min({x,y,z})<0){
while(1){
continue;
}
}
vector<int>arr(3);
arr[0]=x;
arr[1]=y;
arr[2]=z;
sort(arr.begin(),arr.end());
x=arr[0];
y=arr[1];
z=arr[2];
if(mem.find({x,y,z})!=mem.end()){
return mem[{x,y,z}];
}
cout << "? " << x << " " << y << " " << z << endl;
int r;
cin >> r;
set<array<int,2>>ans;
for(int i = 0;i<r;i++){
int a,b;
cin >> a;
cin >> b;
ans.insert({min(a,b),max(a,b)});
}
mem[{x,y,z}]=ans;
return mem[{x,y,z}];
}
const int mxn = 500;
bool parted[mxn];
void bin(vector<int>&arr){
int n = arr.size();
if(n<=2){
return;
}
fill(parted,parted+mxn,0);
vector<int>left,right;
int x = arr[(int)(rng()%n)];
parted[x]=1;
left.push_back(x);
int y = arr[(int)(rng()%n)];
while(y==x){
y = arr[(int)(rng()%n)];
}
parted[y]=1;
right.push_back(y);
while((left.size()+right.size())<n){
int z = arr[(int)(rng()%n)];
while(parted[z]){
z = arr[(int)(rng()%n)];
}
set<array<int,2>>q = query(x,y,z);
if(q.find({min(x,z),max(x,z)})!=q.end()){
///this one exists so put in left
parted[z]=1;
left.push_back(z);
}
else if(q.find({min(y,z),max(y,z)})!=q.end()){
///it exists in right
parted[z]=1;
right.push_back(z);
}
else{
///huh must restart
fill(parted,parted+mxn,0);
left.clear();
right.clear();
///lets take x,z as it bigger
y=z;
parted[x]=1;
left.push_back(x);
parted[y]=1;
right.push_back(y);
}
}
///partition successful
if(left.size()<right.size()){
swap(left,right);
}
bin(left);
bin(right);
set<array<int,2>>q=query(left[left.size()-1],left[0],right[0]);
if(q.find({min(left[0],right[0]),max(left[0],right[0])})!=q.end()){
reverse(left.begin(),left.end());
}
if(right.size()!=1&&right.size()!=0){
q=query(right[right.size()-1],right[0],left[0]);
if(q.find({min(left[left.size()-1],right[right.size()-1]),max(left[left.size()-1],right[right.size()-1])})!=q.end()){
reverse(right.begin(),right.end());
}
}
for(int i = 0;i<left.size();i++){
arr[i]=left[i];
}
for(int i = left.size();i<n;i++){
arr[i]=right[i-left.size()];
}
}
void solve(){
while(mem.size()){
mem.erase(mem.begin());
}
int n;
cin >> n;
N=n;
vector<int>arr(n);
iota(arr.begin(),arr.end(),0);
bin(arr);
cout << "! ";
for(int i : arr){
cout << i << " ";
}
cout << endl;
}
signed main(){
int t,k;
cin >> t >> k;
while(t--){
solve();
}
return 0;
}