#include "icc.h"
#include <bits/stdc++.h>
#define ll long long
#define el cout << endl
#define ii pair<int, int>
#define fi first
#define se second
using namespace std;
const int maxn = 1e2;
struct DSU
{
int n;
vector<int> leader, sz;
DSU(int n = 0) : n(n)
{
leader.assign(n + 10, 0);
sz.assign(n + 10, 1);
iota(leader.begin(), leader.end(), 0);
}
int find_leader(int x)
{
if (x == leader[x])
return x;
return leader[x] = find_leader(leader[x]);
}
void connect(int x, int y)
{
x = find_leader(x);
y = find_leader(y);
if (x == y)
return ;
if (sz[x] < sz[y])
swap(x, y);
sz[x] += sz[y];
leader[y] = x;
}
};
int do_query(vector<int> a, vector<int> b)
{
int sz_a = a.size();
int sz_b = b.size();
int _a[sz_a];
int _b[sz_b];
for (int i = 0; i < sz_a; i++)
_a[i] = a[i];
for (int i = 0; i < sz_b; i++)
_b[i] = b[i];
return query(sz_a, sz_b, _a, _b);
}
namespace SUBTASK_1
{
int n;
DSU D;
void run(int N)
{
n = N;
D = DSU(n);
for (int _ = 1; _ <= n - 1; _++)
{
for (int i = 1; i <= n; i++)
{
bool flag = 0;
for (int j = i + 1; j <= n; j++)
{
if (D.find_leader(i) == D.find_leader(j))
continue;
if (do_query({i}, {j}))
{
setRoad(i, j);
D.connect(i, j);
flag = 1;
break;
}
}
if (flag)
break;
}
}
}
bool check_sub(int n)
{
return n == 15;
}
};
namespace SUBTASK_2
{
int n;
DSU D;
void run(int N)
{
n = N;
D = DSU(n);
for (int _ = 1; _ < n; _++)
{
vector<int> x;
for (int i = 1; i <= n; i++)
{
vector<int> y;
for (int j = 1; j <= n; j++)
{
if (D.find_leader(i) == D.find_leader(j))
continue;
y.push_back(j);
}
if (do_query({i}, y))
x.push_back(i);
}
assert(x.size() == 2);
D.connect(x[0], x[1]);
setRoad(x[0], x[1]);
}
}
};
void run(int N)
{
SUBTASK_2::run(N);
}