#include <bits/stdc++.h>
using namespace std;
const int maxn = (1 << 20) + 10;
vector<pair<int, int> > vec[maxn];
vector<int> ans;
int vis[maxn];
int p[maxn / 2][2];
int n;
void dfs(int u) {
  vis[u] = 1;
  for (auto& tmp : vec[u]) {
    int v = tmp.first;
    if (!vis[v]) dfs(v);
  }
}
bool check(int s) {
  for (int i = 0; i <= s; i++) {
    vis[i] = 0;
    vector<pair<int, int> >().swap(vec[i]);
  }
  for (int i = 1; i <= n; i++) {
    int u = (p[i][0] & s);
    int v = (p[i][1] & s);
    vec[u].emplace_back(v, 2 * i - 1);
    vec[v].emplace_back(u, 2 * i - 2);
  }
  int cnt = 0;
  for (int i = 0; i <= s; i++) {
    if (vec[i].size() & 1) return false;
    if (!vis[i] && vec[i].size()) {
      ++cnt;
      dfs(i);
    }
  }
  return cnt == 1;
}
void dfs2(int u, int pre) {
  while (!vec[u].empty()) {
    auto tmp = vec[u].back();
    vec[u].pop_back();
    int id = tmp.second / 2;
    if (vis[id]) continue;
    vis[id] = 1;
    dfs2(tmp.first, tmp.second);
  }
  if (pre != -1) {
    ans.emplace_back(pre);
    ans.emplace_back(pre ^ 1);
  }
}
void solve(int s) {
  for (int i = 0; i <= n; i++) vis[i] = 0;
  for (int i = 0; i <= s; i++) {
    if (vec[i].size()) {
      dfs2(i, -1);
      break;
    }
  }
  for (int i = 0; i < 2 * n; i++)
    printf("%d%c", ans[i] + 1, i == 2 * n - 1 ? '\n' : ' ');
  return;
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d%d", &p[i][0], &p[i][1]);
  for (int i = 20; i >= 0; i--) {
    int s = (1 << i) - 1;
    if (!check(s)) continue;
    printf("%d\n", i);
    solve(s);
    break;
  }
  return 0;
}
