#include<bits/stdc++.h>
#include "voltage.h"
using namespace std;
#define task "a"
#define se second
#define fi first
#define ll long long
#define ii pair<ll, ll>
const long mxN = 2e5 + 7;
int n, m;
bool tt[mxN];
bool Leaf(int j)
{
vector<int> v;
for (int i = 0; i < n; i++)
v.push_back(tt[i]);
vector<int> u = v;
u[j] = 0;
return !query(u, v);
}
bool exist(int j, vector<int> t)
{
vector<int> u(n, 0), v(n, 0);
for (int j : t)
u[j] = v[j] = 1;
v[j] = 1;
// cerr << "QUERY: " << j << "\n";
// for (int i : u)
// cerr << i << " ";
// cerr << '\n';
// for (int i : v)
// cerr << i << " ";
// cerr << '\n';
return query(u, v);
}
bool solve(int N, int M)
{
n = N;
m = M;
for (int i = 0; i < n; i++)
tt[i] = 1;
vector<int> topo;
for (int i = 0; i < n; i++)
{
if (Leaf(i))
topo.push_back(i);
}
// cerr << "TOPO: ";
// for (int i : topo)
// cerr << i << " ";
// cerr << '\n';
vector<ii> ans;
while (topo.size())
{
int j = topo.back();
topo.pop_back();
tt[j] = 0;
vector<int> rem;
for (int i = 0; i < n; i++)
{
if (tt[i])
rem.push_back(i);
}
// cerr << "REM: ";
// for (int i : rem)
// cerr << i << " ";
// cerr << '\n';
int stt = 0;
vector<int> w;
while (exist(j, w))
{
int l = 0, r = rem.size() - 1, res = 0;
while (l <= r)
{
int mid = (l + r) / 2;
vector<int> tmp;
for (int u = 0; u < rem.size(); u++)
{
if (u < stt || mid < u)
tmp.push_back(rem[u]);
}
if (exist(j, tmp))
{
res = mid;
r = mid - 1;
}
else
l = mid + 1;
}
//cerr << "EDGE " << j << " " << rem[res] << '\n';
w.push_back(rem[res]);
ans.push_back({j, rem[res]});
if (Leaf(rem[res]))
topo.push_back(rem[res]);
stt = res + 1;
//break;
}
}
if (ans.size() != m)
return 0;
for (ii i : ans)
answer(i.fi, i.se);
return 1;
}