#include <bits/stdc++.h>
using namespace std;
const int lg = 22;
const int maxn = 1 << lg;
int n;
int ANS;
int u[maxn];
int v[maxn];
int felan = 1;
int deg[maxn];
bool mark[maxn];
int madude[maxn];
vector<pair<int, int>> adj[maxn], ans;
vector<pair<int, pair<int, int>>> newbois[maxn];
void in();
void solve();
void gofor(int x);
void MAKE(int ID, int u);
void make(int ID, int u);
bool has(int x);
void dfs(int u);
void out();
int main() {
  ios::sync_with_stdio(false);
  cout.tie(0);
  cin.tie(0);
  in();
  solve();
  out();
}
void in() {
  cin >> n;
  for (int i = 0; i < n; i++) cin >> u[i] >> v[i];
}
void solve() {
  int l = 0;
  int r = 21;
  while (r - l != 1) {
    int mid = (l + r) >> 1;
    if (has(mid))
      l = mid;
    else
      r = mid;
  }
  ANS = l;
  gofor(l);
}
void gofor(int x) {
  for (int i = 0; i < maxn; i++) {
    adj[i].clear();
    mark[i] = 0;
  }
  int mask = (1 << x) - 1;
  for (int i = 0; i < n; i++) {
    adj[u[i] & mask].push_back({i * 2 + 1, v[i] & mask});
    adj[v[i] & mask].push_back({i * 2, u[i] & mask});
    deg[u[i] & mask]++;
    deg[v[i] & mask]++;
  }
  for (int i = 0; i < (1 << x); i++)
    if (deg[i]) MAKE(0, i);
}
void MAKE(int ID, int u) {
  make(ID, u);
  int now = u;
  for (auto i : newbois[ID]) {
    if (deg[now]) MAKE(felan++, now);
    ans.push_back(i.second);
    now = i.first;
  }
  if (deg[now]) MAKE(felan++, now);
}
void make(int ID, int u) {
  for (; madude[u] < adj[u].size(); madude[u]++) {
    auto v = adj[u][madude[u]];
    if (!mark[v.first / 2]) {
      newbois[ID].push_back({v.second, {v.first ^ 1, v.first}});
      mark[v.first / 2] = 1;
      deg[u]--;
      deg[v.second]--;
      make(ID, v.second);
      return;
    }
  }
}
bool has(int x) {
  for (int i = 0; i < (1 << x); i++) {
    adj[i].clear();
    mark[i] = 0;
  }
  int mask = (1 << x) - 1;
  for (int i = 0; i < n; i++) {
    adj[u[i] & mask].push_back({i * 2 + 1, v[i] & mask});
    adj[v[i] & mask].push_back({i * 2, u[i] & mask});
  }
  int boi = 0;
  for (int i = 0; i < (1 << x); i++) {
    if (adj[i].size() % 2) return 0;
    if (adj[i].size() != 0 && !mark[i]) {
      dfs(i);
      boi++;
    }
  }
  if (boi <= 1) return 1;
  return 0;
}
void dfs(int u) {
  mark[u] = 1;
  for (auto v : adj[u])
    if (!mark[v.second]) dfs(v.second);
}
void out() {
  cout << ANS << '\n';
  for (auto i : ans) cout << i.first + 1 << ' ' << i.second + 1 << ' ';
}
