#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>
#define all(a) (a).begin(), (a).end()
#define popcount __builtin_popcountll
using namespace std;
using namespace __gnu_pbds;
template<typename T> using ordered_set = tree<T, null_type, less_equal<>, rb_tree_tag, tree_order_statistics_node_update>;
void answer(std::vector<int> C, std::vector<int> X, std::vector<int> Y);
const int N = 5e5;
int L[N], R[N], dir[N];
int node = 0;
int construct(int k, int root, int& pos, int daddy = -1) {
node = max(node, root);
// cout<<k<<" "<<root<<" "<<pos<<" "<<daddy<<"\n";
if (k == 2) {
L[root] = 676767;
R[root] = daddy == -1 ? 676767 : daddy;
return root;
}
if (k % 2 == 0) {
L[root] = construct(k/2, node + 1, pos);
R[root] = construct(k/2, node + 1, pos, daddy);
return root;
} else {
L[root] = construct(1 + k / 2, node + 1, pos, root);
R[root] = construct(1 + k / 2, node + 1, pos, daddy);
return root;
}
}
void add_leaf(int root, int val) {
int& go = dir[root] == 0 ? L[root] : R[root];
dir[root] ^= 1;
if (go == 676767)
go = val;
else
add_leaf(go, val);
}
void create_circuit(int m, std::vector<int> A) {
A.push_back(0);
int n = A.size();
int root = 0, p = 0;
construct(n, root, p);
for (int x : A)
add_leaf(0, ~x);
vector<int> C(m+1, -1);
vector<int> X, Y;
for (int i = 0; i < 2*(n-1); i++) {
// if (L[i] == 0 && R[i] == 0) continue;
X.push_back(~L[i]);
Y.push_back(~R[i]);
}
answer(C, X, Y);
}