#include <bits/stdc++.h>
using namespace std;
map<array<int,3>,set<array<int,2>>>mem;
set<array<int,2>>query(int x, int y, int z){
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({a,b});
}
mem[{x,y,z}]=ans;
return mem[{x,y,z}];
}
void bin(vector<int>&arr){
int n = arr.size();
for(int i : arr){
cerr << i << " ";
}
cerr << endl;
while(n==0){
continue;
}
if(n<=2){
return;
}
vector<int>left,right;
set<int>parted;
int x = arr[rand()%n];
int y = arr[rand()%n];
while(y==x){
y = arr[rand()%n];
}
parted.insert(x);
parted.insert(y);
left.push_back(x);
right.push_back(y);
while(parted.size()!=n){
int z = arr[rand()%n];
while(parted.find(z)!=parted.end()){
z = arr[rand()%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.insert(z);
left.push_back(z);
}
else if(q.find({min(y,z),max(y,z)})!=q.end()){
///it exists in right
parted.insert(z);
right.push_back(z);
}
else{
///huh must restart
parted.clear();
left.clear();
right.clear();
///lets take x,z as it bigger
y=z;
parted.insert(x);
parted.insert(y);
left.push_back(x);
right.push_back(y);
}
}
///partition successful
bin(left);
bin(right);
if(left.size()<right.size()){
swap(left,right);
}
set<array<int,2>>q=query(left.back(),left.front(),right.front());
if(q.find({min(left.front(),right.front()),max(left.front(),right.front())})!=q.end()){
reverse(left.begin(),left.end());
}
if(right.size()!=1){
q=query(right.back(),right.front(),left.front());
if(q.find({min(left.back(),right.back()),max(left.back(),right.back())})!=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(){
mem.clear();
int n;
cin >> 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;
}