#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("Ofast")
#pragma GCC target("avx")
bool RELAXED = false;
template <int, typename T>
struct MINMAX {
  T val;
  MINMAX(T val) : val(val) {}
};
template <typename T>
MINMAX<1, T> MAX(T val) {
  return MINMAX<1, T>(val);
};
template <typename T>
MINMAX<2, T> MIN(T val) {
  return MINMAX<2, T>(val);
};
template <typename T, typename U>
inline T& operator|=(T& lhs, MINMAX<1, U> rhs) {
  return lhs = (rhs.val > lhs ? (RELAXED = true, rhs.val)
                              : (RELAXED = false, lhs));
}
template <typename T, typename U>
inline T& operator|=(T& lhs, MINMAX<2, U> rhs) {
  return lhs = (rhs.val < lhs ? (RELAXED = true, rhs.val)
                              : (RELAXED = false, lhs));
}
template <typename T, typename U>
istream& operator>>(istream& in, pair<T, U>& p) {
  in >> p.first >> p.second;
  return in;
}
template <typename T>
inline vector<T> READ(int n) {
  vector<T> vec(n);
  for (int i = 0; i < int(n); i++) cin >> vec[i];
  return vec;
}
template <typename T>
using min_heap = priority_queue<T, vector<T>, greater<T> >;
const int MAXN = 1.1e6;
vector<pair<int, int> > pearls;
vector<pair<int, int> > node[MAXN];
bool visited[MAXN];
void solve(int bits) {
  int mask = (1 << bits) - 1;
  int start = 0;
  for (int i = 0; i < int(MAXN); i++) {
    node[i].clear();
    visited[i] = false;
  }
  for (int i = 0; i < int(int(pearls.size())); i++) {
    auto p = pearls[i];
    int v1 = p.first & mask;
    int v2 = p.second & mask;
    node[v1].push_back({v2, i});
    node[v2].push_back({v1, i});
    start = v2;
  }
  for (int i = 0; i < int(MAXN); i++) {
    if (int(node[i].size()) % 2) return;
  }
  vector<int> stnode;
  vector<pair<int, int> > stedge;
  vector<pair<int, int> > circuit;
  stnode.push_back(start);
  stedge.push_back({-1, -1});
  while (stnode.size()) {
    int v = stnode.back();
    vector<pair<int, int> >& vadj = node[v];
    while (vadj.size() && visited[vadj.back().second]) {
      vadj.pop_back();
    }
    if (vadj.size()) {
      auto [to, conn] = vadj.back();
      vadj.pop_back();
      pair<int, int> connection = {conn * 2, conn * 2 + 1};
      if ((pearls[conn].first & mask) != v)
        swap(connection.first, connection.second);
      42;
      stnode.push_back(to);
      stedge.push_back(connection);
      visited[conn] = true;
    } else {
      circuit.push_back(stedge.back());
      stnode.pop_back();
      stedge.pop_back();
    }
  }
  circuit.pop_back();
  reverse((circuit).begin(), (circuit).end());
  if (circuit.size() < pearls.size()) return;
  cout << bits << endl;
  for (auto p : circuit) cout << p.first + 1 << ' ' << p.second + 1 << ' ';
  {
    cerr << "EXIT #" << 125 << endl;
    cout << "" << endl;
    exit(0);
  };
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  cout << fixed << setprecision(12);
  int n;
  cin >> n;
  for (int i = 0; i < int(n); i++) {
    int a, b;
    cin >> a >> b;
    pearls.push_back({a, b});
  }
  for (int i = int(20); i >= int(0); --i) {
    solve(i);
  }
}
