#include <bits/stdc++.h>
using namespace std;
const int maxn = 1100000 + 100;
struct node {
  int to, next, vis, from;
} bn[maxn * 2 + 100], e[maxn];
int first[maxn], cnt, bb, ds[maxn], ans[maxn], n;
inline void add(int u, int v) {
  bb++;
  bn[bb].to = v;
  bn[bb].next = first[u];
  bn[bb].vis = 0;
  first[u] = bb;
}
void dfs(int now) {
  int p, q;
  for (p = first[now]; p != -1; p = first[now]) {
    first[now] = bn[p].next;
    if (bn[p].vis) continue;
    bn[p].vis = bn[p ^ 1].vis = 1;
    dfs(bn[p].to);
    ans[++cnt] = p / 2;
    if (p % 2) ans[cnt] *= -1;
  }
}
int check(int x) {
  int num, i;
  num = (1 << x) - 1;
  cnt = 0;
  bb = 1;
  memset(first, -1, sizeof(first));
  int maxL = 0;
  for (int i = 1; i <= n; i++) {
    maxL = max(maxL, e[i].from & num);
    maxL = max(maxL, e[i].to & num);
    add(e[i].from & num, e[i].to & num);
    add(e[i].to & num, e[i].from & num);
    ds[e[i].from & num]++, ds[e[i].to & num]++;
  }
  int flag = 1;
  for (int i = 0; i <= maxL; i++) {
    if (ds[i] % 2) {
      flag = 0;
    }
  }
  if (flag == 0) {
    for (int i = 0; i <= maxL; i++) {
      ds[i] = 0;
    }
    return 0;
  }
  for (i = 0; i <= maxL; i++) {
    if (ds[i]) {
      dfs(i);
      break;
    }
  }
  for (int i = 1; i <= maxL; i++) {
    ds[i] = 0;
  }
  if (cnt != n) return 0;
  printf("%d\n", x);
  for (i = cnt; i >= 1; i--) {
    if (ans[i] > 0) {
      printf("%d %d ", 2 * ans[i] - 1, 2 * ans[i]);
    } else {
      printf("%d %d ", 2 * (-ans[i]), -2 * ans[i] - 1);
    }
  }
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d%d", &e[i].from, &e[i].to);
  }
  for (int i = 20; i >= 1; i--) {
    if (check(i)) {
      return 0;
    }
  }
  printf("0\n");
  for (int i = 1; i <= 2 * n; i++) {
    printf("%d ", i);
  }
  printf("\n");
  return 0;
}
