#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
#define ff first
#define ss second
#define pi pair<int, int>
#define pll pair<long long, long long>
#define vi vector<int>
#define vll vector<long long>
#define vpi vector<pair<int,int>>
#define vpll vector<pair<long long, long long>>
#define pb push_back
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define sz(x) (ll)(x).size()
#define forall(it,x) for(auto& it:(x))
#define mp make_pair
pi operator+(pi a, pi b) { return mp(a.ff+b.ff, a.ss+b.ss); }
pi operator-(pi a, pi b) { return mp(a.ff-b.ff, a.ss-b.ss); }
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#include "voltage.h"
int am = 0;
int n, m;
void Edge(int a, int b) {
// cerr << "edge: " << a << " " << b << "\n";
am++;
answer(a, b);
}
int root;
vector<int> nei, sinks;
void cdq(vector<int> v) {
if(v.empty()) return;
if(v.size() == 1) {
int V = v[0];
vector<int> X(n,0);
for(auto x : sinks) X[x] = 1;
X[V] = 1;
auto Y = X;
X[root] = 0;
if(query(X,Y) == -1) {
nei.pb(V);
}
return;
}
int s = v.size();
int mid = s/2;
vector<int> L, R;
for(int i=0; i<mid; ++i) L.pb(v[i]);
for(int i=mid; i<s; ++i) R.pb(v[i]);
vector<int> X(n,0);
for(auto x : sinks) X[x] = 1;
for(auto x : L) X[x] = 1;
auto Y = X;
X[root] = 0;
if(query(X,Y) == -1) cdq(L);
X.assign(n, 0);
for(auto x : sinks) X[x] = 1;
for(auto x : R) X[x] = 1;
Y = X;
X[root] = 0;
if(query(X,Y) == -1) cdq(R);
}
bool solve(int N, int M) {
n=N; m=M;
queue<int> Q;
for(int i=0; i<n; ++i) {
vector<int> X(n, 0);
vector<int> Y(n, 0);
Y[i] = 1;
if(query(X,Y) == 0) sinks.pb(i);
}
if(sinks.empty()) return false;
for(auto x : sinks) Q.push(x);
int cnt = 0;
vector<int> vis(n);
while(Q.size()) {
int v = Q.front(); Q.pop();
if(vis[v]) continue;
vis[v] = 1;
cnt++;
sinks.pb(v);
vector<int> V;
for(int i=0; i<n; ++i) {
if(i!=v) V.pb(i);
}
root = v;
nei.clear();
cdq(V);
for(auto u : nei) {
Edge(u,v);
vector<int> X(n, 0);
for(auto x : sinks) X[x] = 1;
auto Y = X; Y[u] = 1;
if(query(X, Y) == 0) {
Q.push(u);
}
}
}
return cnt==n;
}