#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int>>> g;
vector<int> ans;
vector<bool> use, vis;
int cnt;
void dfs(int i) {
  vis[i] = true;
  for (auto j : g[i])
    if (!vis[j.first]) dfs(j.first);
}
void dfsans(int i) {
  while (g[i].size()) {
    int a = g[i].back().first, b = g[i].back().second;
    g[i].pop_back();
    if (!use[b]) use[b] = true, dfsans(a);
  }
  ans.push_back(i + 1);
}
int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  int n;
  cin >> n;
  if (n == 1) {
    int a, b;
    cin >> a >> b;
    (a ^= b) &= -a, b = 0;
    while (a) ++b, a >>= 1;
    return cout << (b ? b - 1 : 20) << "\n1 2", 0;
  }
  g.resize(2 * n + (1 << 20));
  int num = 0;
  auto line = [&](int i, int j) {
    g[i].emplace_back(j, num), g[j].emplace_back(i, num);
    ++num;
  };
  for (int i = 0; i < n; ++i) {
    int a, b;
    cin >> a >> b;
    line(i << 1, i << 1 ^ 1), line(i << 1, 2 * n + a),
        line(i << 1 ^ 1, 2 * n + b);
  }
  for (int ii = 20; ~ii; --ii) {
    cnt = 0;
    for (int i = 0; i < 2 * n; ++i)
      if (g[i][1].first - 2 * n >= 1 << ii)
        g[i][1].first = (g[i][1].first - 2 * n & (1 << ii) - 1) + 2 * n,
        g[g[i][1].first].emplace_back(i, g[i][1].second);
    for (int i = 2 * n; i < 2 * n + (1 << ii); ++i)
      if (g[i].size() & 1) goto next;
    vis.assign(2 * n + (1 << ii), false);
    dfs(0);
    for (int i = 0; i < 2 * n; ++i)
      if (!vis[i]) goto next;
    use.assign(num, false);
    dfsans(0);
    ans.pop_back();
    cout << ii << '\n';
    for (int i : ans)
      if (i <= 2 * n) cout << i << ' ';
    return 0;
  next:;
  }
}
