#include <bits/stdc++.h>
using namespace std;
const int maxn = 6e5 + 30;
int n, m, k;
int a[maxn], c[maxn];
int cnt, as;
int flag;
bool ok[maxn << 1];
template <typename T>
inline void read(T &X) {
  X = 0;
  int w = 0;
  char ch = 0;
  while (!isdigit(ch)) {
    w |= ch == '-';
    ch = getchar();
  }
  while (isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48), ch = getchar();
  if (w) X = -X;
}
vector<vector<pair<int, int> > > vc;
vector<vector<pair<int, int> > >::iterator it;
vector<int> ans, tmp;
void dfs(int u, int x) {
  while (!vc[u].empty()) {
    pair<int, int> it = vc[u].back();
    vc[u].pop_back();
    int v = it.first;
    int id = it.second;
    if (!ok[id]) {
      ok[id] = true;
      dfs(v, id);
    }
  }
  if (x != -1) tmp.push_back(x);
}
int jud(int k) {
  int t = (1 << k) - 1;
  vc.clear();
  vc.resize(t + 1 + n);
  for (register int i = (0); i <= (2 * n); i++) ok[i] = false;
  for (register int i = (0); i <= (n - 1); i++) {
    vc[i + t + 1].push_back(make_pair(a[i] & t, i << 1));
    vc[a[i] & t].push_back(make_pair(i + t + 1, i << 1));
    vc[i + t + 1].push_back(make_pair(c[i] & t, i << 1 | 1));
    vc[c[i] & t].push_back(make_pair(i + t + 1, i << 1 | 1));
  }
  for (register int i = (0); i <= (t); i++)
    if (vc[i].size() & 1) return 0;
  tmp.clear();
  for (register int i = (0); i <= (t); i++) {
    if (vc[i].size()) {
      dfs(i, -1);
      break;
    }
  }
  if (tmp.size() < 2 * n) return 0;
  return 1;
}
int main() {
  int T, cas = 1;
  {
    read(n);
    for (register int i = (0); i <= (n - 1); i++) {
      read(a[i]);
      read(c[i]);
    }
    int l = 0, r = 20;
    if (jud(r)) {
      as = r;
      ans = tmp;
    } else
      while (l < r) {
        int mid = (l + r) >> 1;
        if (jud(mid)) {
          l = mid + 1;
          as = mid;
          ans = tmp;
        } else
          r = mid;
      }
    printf("%d\n", as);
    for (register int i = (0); i <= (2 * n - 1); i++)
      printf("%d%c", ans[i] + 1, i == 2 * n - 1 ? '\n' : ' ');
  }
  return 0;
}
