#include <bits/stdc++.h>
#pragma GCC target("avx2")
#pragma GCC optimization("O3")
#pragma GCC optimization("unroll-loops")
using namespace std;
int n, m;
pair<int, int> a[3000005];
int deg[3000005];
set<int> e[3000005];
vector<int> res;
void eu(int cn) {
  while (!e[cn].empty()) {
    int nn = *e[cn].begin();
    e[nn].erase(cn);
    e[cn].erase(nn);
    eu(nn);
  }
  res.push_back(cn);
}
int dsu[3000005];
int fd(int x) {
  if (dsu[x] < 0) return x;
  return dsu[x] = fd(dsu[x]);
}
bool jn(int x, int y) {
  x = fd(x);
  y = fd(y);
  if (x == y) return false;
  if (dsu[x] > dsu[y]) swap(x, y);
  dsu[x] += dsu[y];
  dsu[y] = x;
  return true;
}
bool chk(int j) {
  for (int i = 0; i < (signed)(m + (1 << j)); i++) {
    dsu[i] = -1;
    deg[i] = 0;
  }
  for (int i = 0; i < (signed)(n); i++) {
    int u = i * 2, v = i * 2 + 1;
    int x = a[i].first, y = a[i].second;
    x &= ((1 << j) - 1);
    y &= ((1 << j) - 1);
    deg[u] += 2;
    deg[v] += 2;
    deg[m + x]++;
    deg[m + y]++;
    jn(u, v);
    jn(u, m + x);
    jn(v, m + y);
  }
  int oct = 0;
  bool bad = false;
  for (int i = 0; i < (signed)(m + (1 << j)); i++) {
    if (deg[i] % 2 != 0) {
      bad = true;
      break;
    }
    if (deg[i] != 0 && dsu[i] < 0) ++oct;
  }
  if (bad || oct > 1) return false;
  return true;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = 0; i < (signed)(n); i++) {
    cin >> a[i].first >> a[i].second;
  }
  m = 2 * n;
  int l = 0, r = 21;
  while (l + 1 < r) {
    int mid = (l + r) / 2;
    if (chk(mid)) {
      l = mid;
    } else {
      r = mid;
    }
  }
  int j = l;
  for (int i = 0; i < (signed)(m + (1 << 20)); i++) e[i].clear();
  res.clear();
  for (int i = 0; i < (signed)(n); i++) {
    int u = i * 2, v = i * 2 + 1;
    int x = a[i].first, y = a[i].second;
    x &= ((1 << j) - 1);
    y &= ((1 << j) - 1);
    e[u].insert(v);
    e[v].insert(u);
    e[u].insert(m + x);
    e[m + x].insert(u);
    e[v].insert(m + y);
    e[m + y].insert(v);
  }
  bool bad = false;
  for (int i = 0; i < (signed)(m + (1 << 20)); i++) {
    if (e[i].size() % 2 != 0) {
      bad = true;
      break;
    }
  }
  assert(!bad);
  eu(0);
  res.pop_back();
  if (res.size() == n * 3) {
    cout << j << "\n";
    vector<int> ok;
    for (auto u : res) {
      if (u < m) ok.push_back(u);
    }
    if (ok[0] % 2 == 1) {
      if (ok[1] != ok[0] - 1) {
        int x = ok[0];
        ok.erase(ok.begin());
        ok.push_back(x);
      }
    } else {
      if (ok[1] != ok[0] + 1) {
        int x = ok[0];
        ok.erase(ok.begin());
        ok.push_back(x);
      }
    }
    for (auto u : ok) cout << u + 1 << " ";
    cout << "\n";
    return 0;
  } else {
    assert(false);
  }
  return 0;
}
