#include <bits/stdc++.h>
using namespace std;
const int MAX = 1 << 22;
void no() {
  cout << "NO\n";
  exit(0);
}
int DUM;
int n;
vector<pair<int, int> > V[MAX];
vector<int> sol;
int done[MAX];
int p[MAX];
void dfs(int x) {
  while (!V[x].empty()) {
    pair<int, int> tmp = V[x].back();
    V[x].pop_back();
    if (done[tmp.second]) continue;
    done[tmp.second] = 1;
    dfs(tmp.first);
    sol.push_back(tmp.first);
  }
}
int ne;
void edge(int a, int b) {
  V[a].push_back(pair<int, int>(b, ne));
  V[b].push_back(pair<int, int>(a, ne++));
}
void gen_graph(int mid) {
  ne = 0;
  for (int i = (0); i < (MAX); i++) V[i].clear();
  int mod = 1 << mid;
  for (int i = (0); i < (2 * n); i++) edge(i, DUM + (p[i] % mod));
  for (int i = (0); i < (n); i++) edge(2 * i, 2 * i + 1);
}
void get_euler(int mid) {
  gen_graph(mid);
  dfs(0);
  vector<int> T;
  for (auto it : sol)
    if (it < DUM) T.push_back(it);
  if (abs(T[0] - T[1]) != 1) {
    T.push_back(T[0]);
    T.erase(T.begin());
  }
  for (auto it : T) printf("%d ", it + 1);
  printf("\n");
}
int bio[MAX];
void dfs_con(int x) {
  bio[x] = 1;
  for (auto it : V[x]) {
    if (!bio[it.first]) dfs_con(it.first);
  }
}
int ok(int mid) {
  gen_graph(mid);
  memset(bio, 0, sizeof bio);
  dfs_con(0);
  for (int i = (0); i < (2 * n); i++)
    if (!bio[i]) return 0;
  int mod = 1 << mid;
  for (int i = (0); i < (2 * n); i++) {
    if (V[i].size() & 1) return 0;
    if (V[DUM + (p[i] % mod)].size() & 1) return 0;
  }
  return 1;
}
int main() {
  scanf("%d", &n);
  for (int i = (0); i < (2 * n); i++) scanf("%d", &p[i]);
  DUM = 2 * n;
  int lo = 0, hi = 20;
  while (lo < hi) {
    int mid = (lo + hi + 1) / 2;
    if (ok(mid))
      lo = mid;
    else
      hi = mid - 1;
  }
  printf("%d\n", lo);
  get_euler(lo);
  return 0;
}
