#include "bits/stdc++.h"
#include "icc.h"
using namespace std;
const int MAX_N=105;
vector<int> p(MAX_N);
void init(int n){
iota(p.begin(),p.end(),0);
}
int find_set(int n){
return (p[n]==n) ? n : p[n]=find_set(p[n]);
}
bool same_set(int a, int b){
return find_set(a)==find_set(b);
}
void union_set(int a, int b){
if(same_set(a,b)) return;
p[find_set(b)]=find_set(a);
}
vector<int> get_set(int n, int a){
vector<int> res;
for(int i=0;i<n;i++) if(same_set(i,a)) res.push_back(i);
return res;
}
bool make_query(vector<int> &a, vector<int> &b){
int A[a.size()],B[b.size()];
for(int i=0;i<a.size();i++) A[i]=a[i]+1;
for(int i=0;i<b.size();i++) B[i]=b[i]+1;
return query(a.size(),b.size(),A,B);
}
bool make_query(int a, int b){
int A[1]={a+1},B[1]={b+1};
return query(1,1,A,B);
}
void pri(vector<int> v){
for(int i=0;i<v.size();i++) printf("%d ",v[i]+1); printf("\n");
}
void run(int n){
init(n);
for(int edge=1;edge<n;edge++){
//printf("in edge %d\n",edge);
bool found=false;
for(int i=0;i<n;i++){
if(find_set(i)!=i) continue;
if(found) break;
for(int j=i+1;j<n;j++){
if(find_set(j)!=j || found) continue;
vector<int> a=get_set(n,i),b=get_set(n,j);
if(!make_query(a,b)) continue;
//printf("is between set %d and %d\n",i+1,j+1);
//printf("%d: ",i+1); pri(a);
//printf("%d: ",j+1); pri(b);
for(int i=0;i<a.size();i++){
if(found) continue;
for(int j=0;j<b.size();j++){
if(found) continue;
if(make_query(a[i],b[j])){
//printf("found %d ; %d\n",a[i]+1,b[j]+1);
setRoad(a[i]+1,b[j]+1);
union_set(a[i],b[j]);
found=true;
}
}
}
}
}
//printf("\n");
}
}