#include "Alicelib.h"
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false
const int K = 10;
vector<pii> kraw = {};
void Alice (int n, int m, int A[], int B[]) {
for (int i = 0; i < m; i++) {
kraw.pb({A[i] + 1, B[i] + 1});
}
for (int i = 1; i <= n; i ++) {
for (int j = 0; j < K; j ++) {
if (i & (1 << j)) {
kraw.pb({i, n + j + 1});
}
}
}
for (int i = 0; i < K - 1; i ++) {
kraw.pb({n + i + 1, n + i + 2});
}
kraw.pb({n + 2, n + K});
for (int i = 1; i <= n; i ++) {
kraw.pb({i, n + K + 1});
}
kraw.pb({n + K + 1, n + K + 2});
int x = int(kraw.size());
InitG(n + 12, x);
for (int i = 0; i < x; i ++) {
MakeG(i, kraw[i].st - 1, kraw[i].nd - 1);
}
}
#include "Boblib.h"
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ld;
#define pb push_back
#define pii pair<int, int>
#define pll pair<ll, ll>
#define st first
#define nd second
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
#define debug false
const int MAXN = 1000 + 67;
const int K = 10;
vector<pii> kraw2;
vector<int> graf[MAXN];
bool w[MAXN];
bool licz[MAXN];
vector<int> akt;
bool odw[MAXN];
int co[MAXN];
void Bob (int v, int u, int C[], int D[]){
int n = v - 12;
if (n == 1) {
InitMap(1, 0);
return;
}
for (int i = 0; i < u; i ++) {
//cout << C[i] + 1 << " " << D[i] + 1 << "\n";
graf[C[i] + 1].pb(D[i] + 1);
graf[D[i] + 1].pb(C[i] + 1);
}
int s = 1;
for (int i = 1; i <= v; i ++) {
if (int(graf[i].size()) == 1) {
s = i;
break;
}
}
int p = graf[s][0];
for (auto x : graf[p]) {
w[x] = 1;
}
for (int i = 1; i <= v; i ++) {
if (!w[i] && i != s && i != p) {
licz[i] = 1;
}
}
int zer;
int jed;
for (int i = 1; i <= v; i ++) {
if (!licz[i]) {
continue;
}
int cnt = 0;
for (auto x : graf[i]) {
if (licz[x]) {
cnt ++;
jed = x;
}
}
if (cnt == 1) {
zer = i;
break;
}
}
akt.pb(zer);
akt.pb(jed);
odw[zer] = 1;
odw[jed] = 1;
for (int i = 0; i < K - 2; i ++) {
int v = -1;
for (auto x : graf[akt.back()]) {
if (!licz[x]) {
continue;
}
if (odw[x]) {
continue;
}
if (v == -1) {
v = x;
} else if (int(graf[x].size()) > int(graf[v].size())) {
v = x;
}
}
akt.pb(v);
odw[v] = 1;
}
for (int i = 0; i < K; i ++) {
for (auto x : graf[akt[i]]) {
if (licz[x]) {
continue;
}
co[x] += (1 << i);
}
}
for (int i = 0; i < u; i ++) {
if (co[C[i] + 1] != 0 && co[D[i] + 1] != 0) {
kraw2.pb({co[C[i] + 1] - 1, co[D[i] + 1] - 1});
}
}
InitMap(n, int(kraw2.size()));
for (auto x : kraw2) {
//cout << x.st << " " << x.nd << "\n";
MakeMap(x.st, x.nd);
}
}