#include <bits/stdc++.h>
using namespace std;
bool used[(1 << 20) + 7], vis[500005];
vector<int> g[(1 << 20) + 7];
int kol[(1 << 20) + 7];
vector<pair<int, int> > spis[(1 << 20) + 7];
vector<int> euler;
int mas1[500005], mas2[500005];
void dfs(int v) {
  used[v] = true;
  for (int i = 0; i < (int)g[v].size(); i++) {
    int u = g[v][i];
    if (!used[u]) dfs(u);
  }
  return;
}
void find_euler(int v) {
  while (!spis[v].empty()) {
    pair<int, int> rb = spis[v].back();
    spis[v].pop_back();
    if (vis[(rb.second + 1) / 2]) continue;
    vis[(rb.second + 1) / 2] = true;
    find_euler(rb.first);
    if (rb.second % 2 == 1)
      euler.push_back(rb.second + 1), euler.push_back(rb.second);
    else
      euler.push_back(rb.second - 1), euler.push_back(rb.second);
  }
  return;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int n;
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> mas1[i] >> mas2[i];
  }
  int bit = 1;
  for (; bit <= 20; bit++) {
    int mask = (1 << bit) - 1;
    bool fl = true;
    for (int i = 0; i <= mask; i++) used[i] = false, kol[i] = 0, g[i].clear();
    for (int i = 1; i <= n; i++) kol[mas1[i] & mask]++, kol[mas2[i] & mask]++;
    for (int i = 0; i <= mask; i++)
      if (kol[i] % 2 == 1) fl = false;
    if (!fl) break;
    for (int i = 1; i <= n; i++) {
      int u = (mas1[i] & mask), v = (mas2[i] & mask);
      g[u].push_back(v), g[v].push_back(u);
    }
    int komp = 0;
    for (int i = 0; i <= mask; i++)
      if (kol[i] > 0 && !used[i]) {
        komp++;
        dfs(i);
      }
    if (komp > 1) break;
  }
  bit--;
  cout << bit << '\n';
  int mask = (1 << bit) - 1;
  for (int i = 1; i <= n; i++) {
    int u = (mas1[i] & mask), v = (mas2[i] & mask);
    spis[u].push_back(make_pair(v, 2 * i - 1)),
        spis[v].push_back(make_pair(u, 2 * i));
  }
  for (int i = 0; i <= mask; i++)
    if ((int)spis[i].size() > 0) {
      find_euler(i);
      break;
    }
  for (int i = 0; i < 2 * n; i++) cout << euler[i] << ' ';
  cout << '\n';
  return 0;
}
