#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int c = 1 << 20;
ifstream fin("AAtest.in.txt");
struct paar {
  int v1, v2, mil1, mil2;
};
struct jupp {
  int n1, n2, vaa;
};
int n, viim, ast, palju[c + 5];
paar a[500005];
vector<pair<int, int> > v[c + 5];
vector<jupp> te[c + 5];
vector<int> vas, vas1;
bool kul[1000005], kai[c + 5];
void tee(int j, int ast) {
  vector<pair<int, int> > v1, v0;
  v1.resize(0);
  v0.resize(0);
  int o, p;
  for (int i = 0; i < v[j].size(); i++) {
    o = v[j][i].first;
    p = (v[j][i].second + 1) / 2;
    if ((o | ast) == o) {
      v1.push_back(v[j][i]);
      if (v[j][i].second % 2)
        a[p].mil1 = j + ast;
      else
        a[p].mil2 = j + ast;
    } else {
      v0.push_back(v[j][i]);
      if (v[j][i].second % 2)
        a[p].mil1 = j;
      else
        a[p].mil2 = j;
    }
  }
  v[j] = v0;
  v[j + ast] = v1;
}
void leia(int l) {
  int p;
  jupp j;
  te[l].resize(0);
  for (int i = 0; i < v[l].size(); i++) {
    p = (v[l][i].second + 1) / 2;
    if (a[p].mil1 != l) {
      j.n1 = p * 2;
      j.n2 = p * 2 - 1;
      j.vaa = a[p].mil1;
      te[l].push_back(j);
    }
    if (a[p].mil2 != l) {
      j.n1 = p * 2 - 1;
      j.n2 = p * 2;
      j.vaa = a[p].mil2;
      te[l].push_back(j);
    }
  }
}
void vastus(int l) {
  int o = palju[l];
  for (int i = o; i < te[l].size(); i++) {
    palju[l]++;
    if (!kul[te[l][i].n1]) {
      kul[te[l][i].n1] = 1;
      kul[te[l][i].n2] = 1;
      vastus(te[l][i].vaa);
      vas.push_back(te[l][i].n2);
      vas.push_back(te[l][i].n1);
      if (kai[l]) break;
    }
  }
  if (kai[l] == 0) {
    int o, p;
    for (int i = 0; i < v[l].size(); i++)
      if (!kul[v[l][i].second]) {
        p = (v[l][i].second + 1) / 2;
        if (a[p].mil1 == l && a[p].mil2 == l) {
          kul[p * 2 - 1] = 1;
          vas.push_back(p * 2 - 1);
          kul[p * 2] = 1;
          vas.push_back(p * 2);
        }
      }
    kai[l] = 1;
  }
}
void kirjuta() {
  cout << viim << "\n";
  for (int i = 0; i < 2 * n; i++) cout << vas1[i] << " ";
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cerr.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i].v1 >> a[i].v2;
    a[i].mil1 = 0;
    a[i].mil2 = 0;
    v[0].push_back({a[i].v1, i * 2 - 1});
    v[0].push_back({a[i].v2, i * 2});
  }
  for (int i = 1; i <= 2 * n; i++) vas1.push_back(i);
  ast = 1;
  viim = 0;
  for (int i = 1; i <= 20; i++) {
    for (int j = c - 1; j >= 0; j--)
      if (v[j].size()) tee(j, ast);
    for (int j = 0; j < c; j++)
      if (v[j].size()) {
        leia(j);
        if (te[j].size() % 2 || v[j].size() % 2 ||
            (v[j].size() < 2 * n && te[j].size() == 0)) {
          kirjuta();
          return 0;
        }
      }
    memset(kul, 0, sizeof(kul));
    memset(kai, 0, sizeof(kai));
    memset(palju, 0, sizeof(palju));
    for (int j = 0; j < c; j++)
      if (v[j].size()) {
        vas.resize(0);
        vastus(j);
        if (vas.size() == 2 * n)
          vas1 = vas;
        else {
          kirjuta();
          return 0;
        }
        break;
      }
    ast *= 2;
    viim++;
  }
  kirjuta();
}
