#include <bits/stdc++.h>
using namespace std;
using LL = long long;
using pii = pair<int, int>;
using UI = unsigned int;
const int mod = 1e9 + 7;
const int inf = 0x3f3f3f3f;
const double EPS = 1e-8;
const double PI = acos(-1.0);
const int N = 5e5 + 10;
const int M = N + (1 << 20);
int n, a[N][2];
int deg[1 << 20];
bool vis[N << 1];
vector<pii> G[M];
vector<int> ans;
void dfs(int x, int idx) {
  pii p;
  while (G[x].size()) {
    p = G[x].back();
    G[x].pop_back();
    if (!vis[p.second]) {
      vis[p.second] = 1;
      dfs(p.first, p.second);
    }
  }
  if (idx != -1) {
    ans.emplace_back(idx);
  }
}
void add_edge(int x, int y, int idx) {
  G[x].emplace_back(y, idx);
  G[y].emplace_back(x, idx);
}
bool ok(int k) {
  int mask = (1 << k) - 1;
  for (int i = (0); i < ((1 << k)); ++i) {
    deg[i] = 0;
  }
  for (int i = (0); i < ((1 << k) + n); ++i) {
    G[i].clear();
  }
  int x, y, z;
  int offset = 1 << k;
  for (int i = (0); i < (n); ++i) {
    x = a[i][0] & mask;
    y = a[i][1] & mask;
    deg[x] += 1;
    deg[y] += 1;
    add_edge(x, i + offset, i << 1);
    add_edge(y, i + offset, i << 1 | 1);
  }
  for (int i = (0); i < (1 << k); ++i) {
    if (deg[i] & 1) return 0;
  }
  for (int i = (0); i < (n << 1); ++i) {
    vis[i] = 0;
  }
  ans.clear();
  for (int i = (0); i < (n + (1 << k)); ++i) {
    if (G[i].size()) {
      dfs(i, -1);
      break;
    }
  }
  if (ans.size() < n * 2) {
    return 0;
  }
  printf("%d\n", k);
  for (int i = (0); i < (ans.size()); ++i) {
    printf("%d ", ans[i] + 1);
  }
  puts("");
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = (0); i < (n); ++i) {
    scanf("%d %d", &a[i][0], &a[i][1]);
  }
  for (int i = (20); i > (0); --i) {
    if (ok(i)) {
      return 0;
    }
  }
  puts("0");
  for (int i = (1); i < (n + 1); ++i) {
    printf("%d %d ", i * 2 - 1, i * 2);
  }
  puts("");
  return 0;
}
