#include <bits/stdc++.h>
using namespace std;
using u64 = uint64_t;
long long int gcd(long long int a, long long int b) {
  if (a == 0) return b;
  return gcd(b % a, a);
}
int bin(long int a[], long int low, long int high, long d, long day[]) {
  if (low > high) return -1;
  long mid = (low + high) / 2;
  if (a[mid] > (a[low] + d) && (a[mid - 1] <= (a[low] + d) || day[mid - 1]) &&
      day[mid] == 0)
    return mid;
  else if (a[mid] > (a[low] + d) && day[mid] == 0)
    return bin(a, low, mid - 1, d, day);
  else
    return bin(a, mid + 1, high, d - a[mid + 1] + a[low], day);
}
long long power(long long a, long long b) {
  if (b == 0) return 1;
  if (b % 2 == 0) return (power(((a * a)), b / 2));
  return (((a) * (power(((a * a)), b / 2))));
}
bool cmp(int a, int b) { return a > b; }
bool sortbysecdesc(const pair<int, int> &a, const pair<int, int> &b) {
  return a.first > b.first;
}
u64 binpower(u64 base, u64 e, u64 m) {
  u64 ans = 1;
  base %= m;
  while (e) {
    if (e & 1) {
      ans = ans * base % m;
    }
    base = base * base % m;
    e >>= 1;
  }
  return ans;
}
const int N = 1 << 20;
vector<pair<int, int> > part(N), g[N];
int vi[N];
vector<int> ans;
int n;
void dfs(int u) {
  vi[u]++;
  for (auto x : g[u]) {
    if (!vi[x.first]) dfs(x.first);
  }
}
bool check(int mask) {
  int u, v, i;
  for (i = 0; i <= mask; i++) {
    g[i].clear();
    vi[i] = 0;
  }
  for (long long int i = 0; i < (n); i++) {
    u = part[i].first & mask;
    v = part[i].second & mask;
    g[u].push_back({v, 2 * i});
    g[v].push_back({u, 2 * i + 1});
  }
  int comp = 0, p;
  for (i = 0; i <= mask; i++) {
    p = g[i].size();
    if (p % 2) return false;
    if (p && !vi[i]) {
      dfs(i);
      comp++;
    }
  }
  return comp == 1;
}
void go(int u, int par = -1) {
  while (!g[u].empty()) {
    pair<int, int> x = g[u].back();
    g[u].pop_back();
    if (vi[x.second / 2]) continue;
    vi[x.second / 2]++;
    go(x.first, x.second);
  }
  if (par != -1) {
    ans.push_back(par ^ 1);
    ans.push_back(par);
  }
}
void restore(int mask) {
  int i;
  for (i = 0; i < n; i++) vi[i] = 0;
  for (i = 0; i <= mask; i++) {
    if (!g[i].empty()) {
      go(i);
      break;
    }
  }
  for (long long int i = 0; i < (2 * n); i++) cout << ans[i] + 1 << " ";
  cout << "\n";
}
int main() {
  int t = 1;
  for (int X = 1; X <= t; X++) {
    cin >> n;
    int i, mask;
    for (long long int i = 0; i < (n); i++)
      cin >> part[i].first >> part[i].second;
    for (i = 20; i >= 0; i--) {
      mask = 1 << i;
      mask--;
      if (check(mask)) {
        cout << i << "\n";
        restore(mask);
        break;
      }
    }
  }
  return 0;
}
