#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  char ch = getchar();
  long long s = 0, w = 1;
  while (ch < '0' || ch > '9') {
    if (ch == '-') w = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    s = s * 10 + ch - '0';
    ch = getchar();
  }
  return s * w;
}
int v[3000010];
int n, ans = 20;
int a[3000010], b[3000010], deg[3000010], fa[3000010], vis[3000010];
struct edge {
  int next, to, id;
} e[3000010 << 1];
int head[3000010], cnt = 1, tag[3000010], d[3000010];
inline void add_edge(int from, int to, int id) {
  e[++cnt] = (edge){head[from], to, id};
  head[from] = cnt;
}
int find(int x) { return x == fa[x] ? x : fa[x] = find(fa[x]); }
inline int Check(int X) {
  memset(deg, 0, sizeof(deg));
  for (register int i = 0; i <= X; i++) deg[i] = 0, fa[i] = i;
  for (register int i = 1; i <= n; i++) {
    int x = a[i] & X, y = b[i] & X;
    deg[x]++, deg[y]++;
    fa[find(x)] = find(y);
  }
  int x = -1;
  for (register int i = 0; i <= X; i++) {
    if (deg[i] % 2)
      return 0;
    else if (deg[i] > 0) {
      if (x == -1)
        x = i;
      else if (find(i) != find(x))
        return 0;
    }
  }
  return 1;
}
void dfs(int x) {
  for (register int &i = head[x]; i; i = e[i].next) {
    if (vis[i]) continue;
    vis[i] = vis[i ^ 1] = 1;
    int id = i;
    dfs(e[i].to);
    tag[id / 2] = id % 2;
    d[++d[0]] = id;
  }
}
inline void Solve(int X) {
  for (register int i = 1; i <= n; i++) {
    int x = a[i] & X, y = b[i] & X;
    add_edge(x, y, i * 2);
    add_edge(y, x, i * 2 + 1);
  }
  int st = 0;
  while (!head[st]) st++;
  dfs(st);
  for (register int i = 1; i <= d[0]; i++) {
    int p = d[i];
    if (p % 2 == 0)
      printf("%d %d ", p, p - 1);
    else
      printf("%d %d ", p - 2, p - 1);
  }
}
int main() {
  n = read();
  for (register int i = 1; i <= n; i++) a[i] = read(), b[i] = read();
  while (!Check((1 << ans) - 1)) ans--;
  printf("%d\n", ans);
  Solve((1 << ans) - 1);
  return 0;
}
