#include <bits/stdc++.h>
using namespace std;
long long mod = 1000000007;
long long inf = 1LL << 50;
const int N = 500000;
int dp[1 << 20] = {0};
vector<vector<pair<int, int>>> graph;
vector<int> starts(1 << 20);
deque<int> path;
pair<int, int> necklaces[N];
bool edges[N] = {false};
void add(int a, int b, int& cnt, int counter) {
  graph[a].push_back({b, counter});
  if (graph[a].size() % 2) {
    cnt++;
  } else {
    cnt--;
  }
  graph[b].push_back({a, counter});
  if (graph[b].size() % 2) {
    cnt++;
  } else {
    cnt--;
  }
  counter++;
}
deque<int> p2;
void recurse(int node) {
  while (starts[node] < graph[node].size()) {
    if (edges[graph[node][starts[node]].second]) {
      int c = starts[node];
      edges[graph[node][starts[node]].second] = false;
      recurse(graph[node][starts[node]++].first);
      path.push_back(graph[node][c].second);
    } else {
      starts[node]++;
    }
  }
}
void circuit() {
  path.clear();
  starts.resize(graph.size(), 0);
  int count = 0;
  int start = 0;
  bool canDo = true;
  for (int i = 0; i < graph.size(); i++) {
    if (graph[i].size() % 2) {
      count++;
      start = i;
      if (count > 2) {
        canDo = false;
        break;
      }
    }
  }
  if (!canDo) {
    return;
  }
  recurse(start);
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  cin.exceptions(cin.failbit);
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    int a, b;
    cin >> a >> b;
    necklaces[i].first = a;
    necklaces[i].second = b;
  }
  for (int ans = 20; ans > 0; ans--) {
    graph.clear();
    graph.resize(1 << 20);
    int cnt = 0;
    int start = 0;
    for (int i = 0; i < n; i++) {
      edges[i] = true;
      int a = (necklaces[i].first & ((1 << ans) - 1));
      int b = (necklaces[i].second & ((1 << ans) - 1));
      start = a;
      add(a, b, cnt, i);
    }
    if (cnt > 0) {
      continue;
    }
    path.clear();
    fill(starts.begin(), starts.begin() + graph.size(), 0);
    recurse(start);
    if (path.size() < n) {
      continue;
    }
    cout << ans << '\n';
    vector<int> sol;
    for (int i = 0; i < n; i++) {
      int c = path[i];
      int a = (necklaces[c].first & ((1 << ans) - 1));
      int b = (necklaces[c].second & ((1 << ans) - 1));
      if (a == start) {
        sol.push_back(c * 2 + 1);
        sol.push_back(c * 2 + 2);
        start = b;
      } else {
        sol.push_back(c * 2 + 2);
        sol.push_back(c * 2 + 1);
        start = a;
      }
    }
    for (int i : sol) {
      cout << i << " ";
    }
    cout << "\n";
    return 0;
  }
  cout << "0\n";
  for (int i = 1; i <= 2 * n; i++) {
    cout << i << " ";
  }
  cout << "\n";
}
