#include <bits/stdc++.h>
using namespace std;
template <typename Tp>
void read(Tp& x) {
  x = 0;
  int fh = 1;
  char ch = 1;
  while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
  if (ch == '-') fh = -1, ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  x *= fh;
}
const int N = 500000 + 10, STA = (1 << 20) + 10;
int n, v1[N], v2[N], Val;
int head[N + STA], nxt[N << 2], to[N << 2], deg[STA], tot;
void add(int x, int y) {
  to[++tot] = y;
  nxt[tot] = head[x];
  head[x] = tot;
}
int ans[N << 2], top;
bool vis[N << 2];
void dfs(int x) {
  for (int& i = head[x]; i; i = nxt[i]) {
    if (vis[i]) continue;
    vis[i] = vis[i ^ 1] = true;
    int y = to[i];
    dfs(y);
    ans[++top] = y;
  }
}
bool Work(int Ans) {
  Val = (1 << Ans) - 1;
  for (int i = 0; i <= Val; ++i) deg[i] = 0;
  for (int i = 1; i <= n; ++i) deg[v1[i] & Val]++, deg[v2[i] & Val]++;
  for (int i = 0; i <= Val; ++i)
    if (deg[i] & 1) return false;
  for (int i = 1; i <= tot; ++i) vis[i] = false;
  for (int i = 1; i <= n + Val + 1; ++i) head[i] = 0;
  tot = 1;
  top = 0;
  for (int i = 1; i <= n; ++i) {
    int u = n + 1 + (v1[i] & Val);
    int v = n + 1 + (v2[i] & Val);
    add(i, u);
    add(u, i);
    add(i, v);
    add(v, i);
  }
  dfs(1);
  int cnt = 0;
  for (int i = 1; i <= top; ++i)
    if (ans[i] <= n) cnt++;
  if (cnt != n) return false;
  printf("%d\n", Ans);
  for (int i = 1; i <= top; ++i) {
    if (ans[i] > n) continue;
    int x = ans[i], y = ans[i + 1];
    if ((v1[x] & Val) == y - n - 1)
      printf("%d %d ", 2 * x, 2 * x - 1);
    else
      printf("%d %d ", 2 * x - 1, 2 * x);
  }
  return true;
}
int main() {
  read(n);
  for (int i = 1; i <= n; ++i) read(v1[i]), read(v2[i]);
  for (int Ans = 20; Ans >= 1; --Ans) {
    Val = (1 << Ans) - 1;
    for (int i = 0; i <= Val; ++i) deg[i] = 0;
    for (int i = 1; i <= n; ++i) deg[v1[i] & Val]++, deg[v2[i] & Val]++;
    bool flag = true;
    for (int i = 0; i <= Val; ++i) {
      if (deg[i] & 1) {
        flag = false;
        break;
      }
    }
    if (!flag) continue;
    for (int i = 1; i <= tot; ++i) vis[i] = false;
    for (int i = 1; i <= n + Val + 1; ++i) head[i] = 0;
    tot = 1;
    top = 0;
    for (int i = 1; i <= n; ++i) {
      int u = n + 1 + (v1[i] & Val);
      int v = n + 1 + (v2[i] & Val);
      add(i, u);
      add(u, i);
      add(i, v);
      add(v, i);
    }
    dfs(1);
    int cnt = 0;
    for (int i = 1; i <= top; ++i)
      if (ans[i] <= n) cnt++;
    if (cnt != n) continue;
    printf("%d\n", Ans);
    for (int i = 1; i <= top; ++i) {
      if (ans[i] > n) continue;
      int x = ans[i], y = ans[i + 1];
      if ((v1[x] & Val) == y - n - 1)
        printf("%d %d ", 2 * x, 2 * x - 1);
      else
        printf("%d %d ", 2 * x - 1, 2 * x);
    }
    return 0;
  }
  printf("0\n");
  for (int i = 1; i <= 2 * n; ++i) printf("%d ", i);
  return 0;
}
