#include"tree.h"
#include<bits/stdc++.h>
#define LL long long
#define mes(s, x) memset(s, x, sizeof s)
#define Maxn 1005
#define inf 0x3f3f3f3f
#define pr pair<int, int>
#define fi first
#define sd second
using namespace std;
// inline LL read(){char c;c = getchar();while(!(('0' <= c && c <= '9') || c == '-')) c = getchar();bool flag = 0;if(c == '-'){flag = 1;c = getchar();}LL tot = 0;while('0' <= c && c <= '9'){tot = 10 * tot + c - '0';c = getchar();}return flag ? -tot : tot;}
// inline char gc(){char c = getchar();while(c == ' ' || c == '\n' || c == '\r') c = getchar();return c;}
// int ask(int u, vector <int> v){
// printf("%d:", u);
// for(int i: v) printf("%d ", i);
// puts("");
// return read();
// }
// void answer(int u, int v){
// printf("!%d %d\n", u, v);
// }
vector<int> g[Maxn];
int dep[Maxn], f[Maxn];
int dis(int i, int j){
int x = dep[i] + dep[j];
if(dep[i] < dep[j]) swap(i, j);
while(dep[i] > dep[j]) i = f[i];
while(i != j) i = f[i], j = f[j];
return x - 2 * dep[i];
}
void solve(vector<int> fa, vector<int> son){
if(son.size() == 0) return;
if(fa.size() == 1){
for(int i: son){
answer(fa[0], i);
f[i] = fa[0];
}
return;
}
int mid = fa.size() >> 1;
vector<int> tmp;
for(int i = 0; i < mid; i++) tmp.push_back(fa[i]);
vector<pr> vec1(fa.size()), vec2(son.size());
for(int i = 0; i < fa.size(); i++){
for(int j = 0; j < mid; j++) vec1[i].fi += dis(fa[i], fa[j]) + 1;
vec1[i].sd = fa[i];
}
for(int i = 0; i < son.size(); i++) vec2[i] = {ask(son[i], tmp), son[i]};
sort(vec1.begin(), vec1.end());
sort(vec2.begin(), vec2.end());
int r1, r2;
for(int i = 0, j = 0; i < fa.size(); i = r1 + 1, j = r2 + 1){
r1 = i;
vector<int> x, y;
x.push_back(vec1[i].sd);
while(r1 + 1 < vec1.size() && vec1[i].fi == vec1[r1 + 1].fi) x.push_back(vec1[++r1].sd);
r2 = j - 1;
while(r2 + 1 < vec2.size() && vec1[i].fi == vec2[r2 + 1].fi) y.push_back(vec2[++r2].sd);
solve(x, y);
}
}
void solver(int n,int A,int B){
// int main(){
// #ifndef ONLINE_JUDGE
// freopen("in","r",stdin);
// freopen("out","w",stdout);
// #endif
srand(time(0));
// int n = read(), A = read(), B = read(), rt;
int rt = rand() % n + 1;
vector<int> tmp;
tmp.push_back(rt);
for(int i = 1; i <= n; i++){
if(i == rt) continue;
g[dep[i] = ask(i, tmp)].push_back(i);
}
for(int i: g[1]) answer(rt, i);
for(int i = 2; i < n; i++) solve(g[i - 1], g[i]);
return 0;
}
/*
g++ tmp.cpp -o tmp.exe -std=c++14 -O2 "-Wl,-stack=102400000"
./tmp.exe
*/