#include <bits/stdc++.h>
using namespace std;
int n;
int a[500010], b[500010];
int ans;
int g[2000010];
int fa[2000010];
int NN;
pair<int, int> Ans[500010];
bool vis[2000010];
int cnt = 1;
struct EDGE {
  int t, next;
  pair<int, int> ed;
} e[2000010];
int gg[2000010];
inline void Add_edge(int x, int y, int a, int b) {
  e[++cnt].t = y;
  e[cnt].ed = {a, b};
  e[cnt].next = gg[x];
  gg[x] = cnt;
}
inline void add_edge(int x, int y, int a, int b) {
  Add_edge(x, y, a, b);
  Add_edge(y, x, b, a);
}
inline int Find(int x) { return fa[x] = x == fa[x] ? x : Find(fa[x]); }
inline void DFS(int x, const pair<int, int> &pre) {
  for (; gg[x]; gg[x] = e[gg[x]].next) {
    if (!vis[gg[x]]) {
      vis[gg[x]] = vis[gg[x] ^ 1] = true;
      DFS(e[gg[x]].t, e[gg[x]].ed);
    }
  }
  Ans[++NN] = pre;
}
inline int read() {
  char c = getchar();
  while (c < 48 || c > 57) c = getchar();
  int temp = 0;
  while (c > 47 && c < 58) {
    temp = temp * 10 + c - 48;
    c = getchar();
  }
  return temp;
}
int main() {
  n = read();
  for (int i = 1; i <= n; i++) {
    a[i] = read();
    b[i] = read();
  }
  for (ans = 1; ans <= 20; ans++) {
    int temp = 1 << ans;
    temp--;
    for (int i = 0; i <= temp; i++) {
      g[i] = 0;
      fa[i] = i;
    }
    for (int i = 1; i <= n; i++) {
      g[a[i] & temp]++;
      g[b[i] & temp]++;
      fa[Find(b[i] & temp)] = Find(a[i] & temp);
    }
    bool flag = true;
    int pre = a[1] & temp;
    for (int i = 0; i <= temp; i++) {
      if ((g[i] & 1) || (g[i] > 0 && Find(i) != Find(pre))) {
        flag = false;
        break;
      }
    }
    if (!flag) break;
  }
  ans--;
  int temp = 1 << ans;
  temp--;
  for (int i = 1; i <= n; i++) {
    add_edge(a[i] & temp, b[i] & temp, 2 * i - 1, 2 * i);
  }
  printf("%d\n", ans);
  DFS(a[1] & temp, {0, 0});
  for (int i = 1; i < NN; i++) {
    printf("%d %d ", Ans[i].second, Ans[i].first);
  }
  return 0;
}
