#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN = 100;
const int MOD = 1000000007;
const double eps = 1e-8;
const double PI = acos(-1.0);
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long qpow(long long a, long long n, long long p = MOD) {
  long long r = 1 % p;
  for (a %= p; n; a = a * a % p, n >>= 1)
    if (n & 1) r = r * a % p;
  return r;
}
long long inv(long long x, long long p = MOD) {
  return x <= 1 ? 1 : inv(p % x, p) * (p - p / x) % p;
}
int n;
pair<int, int> a[500005];
vector<pair<int, int> > g[(1 << 20) + 5];
int vis[(1 << 20) + 5];
void dfs(int now) {
  vis[now] = 1;
  for (auto nxt : g[now]) {
    if (!vis[nxt.first]) {
      dfs(nxt.first);
    }
  }
}
bool check(int msk) {
  for (int i = 0; i <= msk; i++) {
    vis[i] = 0;
    g[i].clear();
  }
  for (int i = 0; i < n; i++) {
    int u = a[i].first & msk, v = a[i].second & msk;
    g[u].push_back({v, i * 2 + 1});
    g[v].push_back({u, i * 2});
  }
  int comp = 0;
  for (int i = 0; i <= msk; i++) {
    if (g[i].size() & 1) {
      return 0;
    }
    if (g[i].size() && !vis[i]) {
      comp++;
      dfs(i);
    }
  }
  return comp == 1;
}
vector<int> ans;
void dfs2(int now, int pre = -1) {
  while (g[now].size()) {
    auto e = g[now].back();
    g[now].pop_back();
    if (vis[e.second >> 1]) {
      continue;
    }
    vis[e.second >> 1] = 1;
    dfs2(e.first, e.second);
  }
  if (pre != -1) {
    ans.push_back(pre);
    ans.push_back(pre ^ 1);
  }
}
void getEuler(int msk) {
  for (int i = 0; i <= n; i++) {
    vis[i] = 0;
  }
  for (int i = 0; i <= msk; i++) {
    if (g[i].size()) {
      dfs2(i);
      break;
    }
  }
  for (int i = 0; i < ans.size(); i++) {
    printf("%d%c", ans[i] + 1, i + 1 == ans.size() ? '\n' : ' ');
  }
}
void solve() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &a[i].first, &a[i].second);
  }
  for (int k = 20; k >= 0; k--) {
    if (check((1 << k) - 1)) {
      printf("%d\n", k);
      getEuler(((1 << k) - 1));
      break;
    }
  }
}
int main(int argc, char* argv[]) {
  int t = 1;
  while (t--) {
    solve();
  }
  return 0;
}
