#include <bits/stdc++.h>
using namespace std;
const int N = (1 << 20) + 20;
const int MOD = 1e9 + 7;
struct edge {
  int v;
  list<edge>::iterator rev;
  edge(int v) : v(v) {}
};
list<edge> g[N];
void add_edge(int a, int b) {
  g[a].push_front(edge(b));
  auto ia = g[a].begin();
  g[b].push_front(edge(a));
  auto ib = g[b].begin();
  ia->rev = ib;
  ib->rev = ia;
}
void go(int u, vector<int> &tour) {
  while (g[u].size()) {
    int v = g[u].front().v;
    g[v].erase(g[u].front().rev);
    g[u].pop_front();
    go(v, tour);
  }
  tour.push_back(u);
};
bool eulerian(vector<int> &tour, int n, int edges) {
  bool ok = true;
  int start = 0;
  for (int i = 0; i < n; i++) {
    ok &= g[i].size() % 2 == 0;
    if (g[i].size() > 0) start = i;
  }
  if (ok) {
    go(start, tour);
    reverse(tour.begin(), tour.end());
    if (tour.size() == edges + 1) return true;
  }
  return false;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int n;
  while (cin >> n) {
    vector<int> a(n), b(n);
    for (int i = 0; i < n; i++) {
      cin >> a[i] >> b[i];
    }
    vector<int> path;
    int low = 0, high = 20;
    while (low <= high) {
      int bit = (low + high) / 2;
      for (int i = 0; i < (1 << bit); i++) g[i].clear();
      int mask = (1 << bit) - 1;
      for (int i = 0; i < n; i++) {
        add_edge(a[i] & mask, b[i] & mask);
      }
      path.clear();
      if (eulerian(path, mask + 1, n))
        low = bit + 1;
      else
        high = bit - 1;
    }
    int bit = high;
    int mask = (1 << bit) - 1;
    map<pair<int, int>, vector<pair<int, int>>> edges;
    for (int i = 0; i < (1 << bit); i++) g[i].clear();
    for (int i = 0; i < n; i++) {
      int x = a[i] & mask, y = b[i] & mask;
      add_edge(x, y);
      edges[{x, y}].push_back({2 * (i + 1) - 1, 2 * (i + 1)});
      edges[{y, x}].push_back({2 * (i + 1), 2 * (i + 1) - 1});
    }
    vector<int> seen(2 * n + 1);
    path.clear();
    eulerian(path, mask + 1, n);
    int k = path.size();
    cout << bit << '\n';
    for (int i = 0; i < k - 1; i++) {
      pair<int, int> x = {path[i], path[(i + 1) % k]};
      vector<pair<int, int>> &v = edges[x];
      while (seen[v.back().first]) v.pop_back();
      seen[v.back().first] = seen[v.back().second] = 1;
      cout << v.back().first << " " << v.back().second << " ";
      v.pop_back();
    }
    cout << '\n';
  }
  return 0;
}
