#include <bits/stdc++.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fll;
template <bool directed>
struct Euler {
  int N;
  vector<vector<pair<int, int>>> adj;
  vector<vector<pair<int, int>>::iterator> its;
  vector<bool> used;
  Euler(int N_) : N(N_), adj(N), its(N) {}
  void ae(int a, int b) {
    int M = used.size();
    used.push_back(0);
    adj[a].emplace_back(b, M);
    if (!directed) adj[b].emplace_back(a, M);
  }
  vector<pair<int, int>> solve(int src = 0) {
    while (!adj[src].size()) src++;
    for (int i = 0; i < N; i++) its[i] = begin(adj[i]);
    vector<pair<pair<int, int>, int>> ret, second = {{{src, -1}, -1}};
    while (second.size()) {
      int x = second.back().first.first;
      auto &it = its[x], en = end(adj[x]);
      while (it != en && used[it->second]) it++;
      if (it == en) {
        if (ret.size() && ret.back().first.second != x) return {};
        ret.push_back(second.back()), second.pop_back();
      } else {
        second.push_back({{it->first, x}, it->second});
        used[it->second] = 1;
      }
    }
    if (ret.size() != used.size() + 1) return {};
    vector<pair<int, int>> ans;
    for (auto& t : ret) ans.push_back({t.first.first, t.second});
    reverse(ans.begin(), ans.end());
    return ans;
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  int N;
  cin >> N;
  vector<pair<int, int>> v(N);
  for (auto& i : v) cin >> i.first >> i.second;
  for (int i = 20; i >= 0; i--) {
    Euler<false> E(1 << i);
    for (auto [l, r] : v) E.ae(l & ((1 << i) - 1), r & ((1 << i) - 1));
    auto ans = E.solve();
    if (!ans.size()) continue;
    if (ans[0].first != ans.back().first) continue;
    ans.erase(ans.begin());
    cout << i << '\n';
    for (auto [j, id] : ans) {
      int a = 2 * id + 1, b = 2 * id + 2;
      if ((v[id].first & ((1 << i) - 1)) == j) swap(a, b);
      cout << a << " " << b << " ";
    }
    cout << '\n';
    break;
  }
  exit(0);
}
