//starusc
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int x=0,f=1,c=getchar();
	while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
	while(isdigit(c)){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
	return f==1?x:-x;
}
int n,rt;
vector<int>ans;
inline int query(int l1,int r1,int l2,int r2){
	cout<<"? "<<r1-l1+1<<" "<<r2-l2+1<<"\n";
	for(int i=l1;i<=r1;i++)cout<<i<<" ";cout<<"\n";
	for(int i=l2;i<=r2;i++)cout<<i<<" ";cout<<"\n";
	fflush(stdout);
	return read(); 
}
void ef(int l,int r){
	if(l==r)return;
	int mid=(l+r)>>1;
	if(query(l,mid,rt,rt)){
		ef(l,mid);
		for(int i=mid+1;i<=r;i++)ans.push_back(i);
	}
	else{
		for(int i=l;i<=mid;i++)ans.push_back(i);
		ef(mid+1,r);
	}
}
inline void solve(){
	ans.clear();
	n=read();
	for(int i=2;i<=n;i++){
		if(query(1,i-1,i,i)){
			rt=i;
			break;
		}
	}
	ef(1,rt-1);
	for(int i=rt+1;i<=n;i++)if(!query(i,i,rt,rt))ans.push_back(i);
	cout<<"! "<<ans.size()<<" ";
	for(auto v:ans)cout<<v<<" ";
	cout<<"\n";fflush(stdout);
}
int main(){
	for(int T=read();T--;)solve(); 
	return (0-0);
}
