#include <bits/stdc++.h>
using namespace std;
const int MX = 6e5 + 5;
int n;
int a[MX], b[MX];
vector<int> res;
vector<pair<int, int> > adj[2 * MX];
int chk[2 * MX], degree[2 * MX];
void dfs(int cur) {
  chk[cur] = 1;
  for (auto nxt : adj[cur]) {
    if (chk[nxt.first]) continue;
    dfs(nxt.first);
  }
}
bool valid(int mid) {
  int i, j, k;
  for (i = 0; i < MX; ++i) adj[i].clear();
  memset(chk, 0, sizeof chk);
  for (i = 0; i < n; ++i) {
    int u = a[i] & ((1 << mid) - 1);
    int v = b[i] & ((1 << mid) - 1);
    adj[u].push_back({v, 2 * i});
    adj[v].push_back({u, 2 * i + 1});
  }
  int cnt = 0;
  for (i = 0; i < n; ++i) {
    int u = a[i] & ((1 << mid) - 1);
    int v = b[i] & ((1 << mid) - 1);
    if (!chk[u]) dfs(u), cnt++;
    int sz1 = adj[u].size(), sz2 = adj[v].size();
    if (sz1 & 1 || sz2 & 1) return 0;
  }
  return cnt == 1;
}
void build_euler_circuit(int node) {
  int i, j, k;
  while (degree[node] < adj[node].size()) {
    pair<int, int> p = adj[node][degree[node]++];
    if (chk[p.second / 2]) continue;
    chk[p.second / 2] = 1;
    build_euler_circuit(p.first);
    res.push_back(p.second ^ 1);
    res.push_back(p.second);
  }
}
int main() {
  int i, j, k;
  scanf("%d", &n);
  for (i = 0; i < n; ++i) scanf("%d %d", &a[i], &b[i]);
  int low = 1, high = 20, ans = 0, mid;
  while (high >= low) {
    mid = (high + low) / 2;
    k = valid(mid);
    if (k)
      low = mid + 1, ans = mid;
    else
      high = mid - 1;
  }
  printf("%d\n", ans);
  valid(ans);
  memset(chk, 0, sizeof chk);
  build_euler_circuit(a[0] & ((1 << ans) - 1));
  reverse(res.begin(), res.end());
  for (auto x : res) printf("%d ", x + 1);
  puts("");
}
