#include using namespace std; struct Step { int edge; int from; int to; }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector a(n), b(n); for (int i = 0; i < n; ++i) cin >> a[i] >> b[i]; for (int bits = 20; bits >= 0; --bits) { int vertices = 1 << bits; int mask = vertices - 1; vector>> graph(vertices); vector degree(vertices, 0); for (int i = 0; i < n; ++i) { int u = a[i] & mask; int v = b[i] & mask; graph[u].push_back({v, i}); graph[v].push_back({u, i}); ++degree[u]; ++degree[v]; } bool possible = true; int start = a[0] & mask; for (int v = 0; v < vertices; ++v) { if (degree[v] & 1) possible = false; if (degree[v] != 0) start = v; } if (!possible) continue; vector iterator(vertices, 0); vector used(n, false); vector vertex_stack{start}; vector entering; vector tour; while (!vertex_stack.empty()) { int v = vertex_stack.back(); while (iterator[v] < static_cast(graph[v].size()) && used[graph[v][iterator[v]].second]) { ++iterator[v]; } if (iterator[v] == static_cast(graph[v].size())) { vertex_stack.pop_back(); if (!entering.empty()) { tour.push_back(entering.back()); entering.pop_back(); } continue; } auto [to, edge] = graph[v][iterator[v]++]; if (used[edge]) continue; used[edge] = true; vertex_stack.push_back(to); entering.push_back({edge, v, to}); } if (static_cast(tour.size()) != n) continue; reverse(tour.begin(), tour.end()); cout << bits << '\n'; for (const Step &step : tour) { int left = 2 * step.edge + 1; int right = 2 * step.edge + 2; if ((a[step.edge] & mask) != step.from) swap(left, right); cout << left << ' ' << right << ' '; } cout << '\n'; return 0; } }