#include <bits/stdc++.h>
using namespace std;
struct EulerCycle {
  struct data__ {
    int u;
    bool rev;
    list<data__>::iterator it;
    data__(int _u, bool _rev) : u(_u), rev(_rev){};
  };
  int n, m;
  vector<list<data__> > a;
  vector<int> path, deg;
  void dfs(int u) {
    while (!a[u].empty()) {
      int v = a[u].front().u;
      if (a[u].front().rev) a[v].erase(a[u].front().it);
      a[u].pop_front();
      dfs(v);
    }
    path.push_back(u);
  }
  void addEdge(int u, int v) {
    a[u].push_front(data__(v, 1));
    a[v].push_front(data__(u, 1));
    a[u].front().it = (a[v].begin());
    a[v].front().it = (a[u].begin());
    deg[u]++;
    deg[v]++;
    m++;
  }
  bool haveEuler() {
    path.clear();
    int sta = -1;
    int total = 0;
    for (int i = (int)0; i <= (int)n - 1; i++)
      if (deg[i] % 2) total++, sta = i;
    if (total != 0) return false;
    if (sta == -1)
      for (int i = (int)0; i <= (int)n - 1; i++)
        if (deg[i]) sta = i;
    if (sta == -1) sta = 0;
    dfs(sta);
    for (int i = (int)0; i <= (int)n - 1; i++)
      if (!a[i].empty()) return false;
    if (path.front() != path.back()) return false;
    reverse(path.begin(), path.end());
    return true;
  }
  EulerCycle(){};
  EulerCycle(int _n) : n(_n), m(0) {
    a.assign(n, list<data__>());
    path.clear();
    deg.assign(n, 0);
  }
} euler;
int n;
vector<pair<int, int> > a;
vector<int> path;
bool check(int mid) {
  if (mid == 0) {
    path.clear();
    for (int i = (int)0; i <= (int)n - 1; i++)
      path.push_back(i * 2), path.push_back(i * 2 + 1);
    return true;
  }
  int mask = (1 << mid) - 1;
  euler = EulerCycle(1 + mask + 2 * n);
  for (int i = (int)0; i <= (int)a.size() - 1; i++) {
    euler.addEdge(i * 2, i * 2 + 1);
    euler.addEdge(i * 2, 2 * n + (mask & a[i].first));
    euler.addEdge(i * 2 + 1, 2 * n + (mask & a[i].second));
  }
  if (euler.haveEuler()) {
    path = euler.path;
    return true;
  }
  return false;
}
signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int i = (int)1; i <= (int)n; i++) {
    int x, y;
    cin >> x >> y;
    a.push_back({x, y});
  }
  int l = 0, r = 20;
  while (l != r) {
    int mid = (l + r + 1) / 2;
    if (check(mid))
      l = mid;
    else
      r = mid - 1;
  }
  check(l);
  cout << l << '\n';
  for (auto it : path) {
    if (it < 2 * n) cout << it + 1 << ' ';
  }
  cout << '\n';
}
