#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
const int M = (1 << 20) + 555;
int n;
int a[N], b[N];
int cnt[M];
bool h[M];
vector<pair<int, pair<int, int>>> v[M];
multiset<pair<int, int>> v2[M];
int total;
void dfs(int x) {
  total += cnt[x];
  h[x] = 1;
  for (auto& u : v[x])
    if (!h[u.first]) dfs(u.first);
}
bool used[M];
int ptr[M];
void dfs2(int x) {
  while (ptr[x] < v[x].size()) {
    auto& u = v[x][ptr[x]++];
    auto& e = u.second;
    if (!used[e.first]) {
      used[e.first] = 1;
      used[e.second] = 1;
      dfs2(u.first);
      printf("%d %d ", e.second, e.first);
    }
  }
}
bool f(int k, bool print = 0) {
  int mask = (1 << k) - 1;
  for (int i = 1; i <= n; i++) {
    int x = (a[i] & mask);
    int y = (b[i] & mask);
    cnt[a[i] & mask] = 0;
    cnt[b[i] & mask] = 0;
    v[a[i] & mask].clear();
    v[b[i] & mask].clear();
    h[x] = 0;
    h[y] = 0;
    ptr[x] = ptr[y] = 0;
  }
  total = 0;
  for (int i = 1; i <= n; i++) {
    int x = (a[i] & mask);
    int y = (b[i] & mask);
    cnt[x]++;
    cnt[y]++;
    v[x].push_back({y, {i * 2 - 1, i * 2}});
    v[y].push_back({x, {i * 2, i * 2 - 1}});
  }
  for (int i = 1; i <= n; i++) {
    int x = (a[i] & mask);
    int y = (b[i] & mask);
    if (cnt[x] % 2 != 0 or cnt[y] % 2 != 0) return 0;
  }
  if (!print)
    dfs(a[1] & mask);
  else
    dfs2(a[1] & mask);
  if (total != 2 * n) return 0;
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d %d", a + i, b + i);
  }
  int l = 0, r = 20;
  while (l < r) {
    int m = (l + r + 1) / 2;
    if (f(m))
      l = m;
    else
      r = m - 1;
  }
  printf("%d\n", l);
  f(l, 1);
  puts("");
  return 0;
}
