#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e6 + 10;
pair<int, int> a[MAXN], now[MAXN];
int n;
int am[MAXN];
int pa[MAXN];
int find(int x) { return pa[x] = pa[x] == x ? x : find(pa[x]); }
void join(int x, int y) { pa[find(x)] = find(y); }
bool test(int c) {
  if (c > 20) return 0;
  int mk = (1 << c) - 1, all = mk + 1;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i)
    now[i].first = a[i].first & mk, now[i].second = a[i].second & mk;
  for (int i = 0, ThxDem = all; i < ThxDem; ++i) am[i] = 0;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i)
    am[now[i].first]++, am[now[i].second]++;
  for (int i = 0, ThxDem = all; i < ThxDem; ++i)
    if (am[i] & 1) return 0;
  for (int i = 0, ThxDem = 2 * n + all; i < ThxDem; ++i) pa[i] = i;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i)
    join(2 * i, 2 * n + now[i].first), join(2 * i + 1, 2 * n + now[i].second);
  for (int i = 0, ThxDem = n; i < ThxDem; ++i) join(2 * i, 2 * i + 1);
  int cmp = 0;
  for (int i = 0, ThxDem = 2 * n + all; i < ThxDem; ++i)
    if (pa[i] == i && (i < 2 * n || am[i - 2 * n])) cmp++;
  return cmp == 1;
}
struct edge {
  int y;
  list<edge>::iterator rev;
  edge(int y) : y(y) {}
};
list<edge> g[MAXN];
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;
}
vector<int> p;
void go(int x) {
  while (g[x].size()) {
    int y = g[x].front().y;
    g[y].erase(g[x].front().rev);
    g[x].pop_front();
    go(y);
  }
  p.push_back(x);
}
vector<int> get_path(int x) {
  p.clear();
  go(x);
  reverse(p.begin(), p.end());
  return p;
}
vector<int> build(int c) {
  int mk = (1 << c) - 1, all = mk + 1;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i)
    now[i].first = a[i].first & mk, now[i].second = a[i].second & mk;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i) {
    add_edge(2 * i, 2 * i + 1);
    add_edge(2 * i, 2 * n + now[i].first);
    add_edge(2 * i + 1, 2 * n + now[i].second);
  }
  auto ans = get_path(0);
  vector<int> r;
  for (auto x : ans)
    if (x < 2 * n) r.push_back(x);
  return r;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int i = 0, ThxDem = n; i < ThxDem; ++i) cin >> a[i].first >> a[i].second;
  int c = 0;
  for (int xx = 16; xx; xx /= 2)
    if (test(c + xx)) c += xx;
  cout << c << "\n";
  auto ans = build(c);
  if (abs(ans[0] - ans[1]) != 1) {
    reverse(ans.begin(), ans.end());
  }
  ans.pop_back();
  for (auto x : ans) cout << x + 1 << " ";
  cout << "\n";
}
