#include <bits/stdc++.h>
using namespace std;
using cd = complex<double>;
long long a[200005], b[105], n, vis[2000005], c[65], now = 1, ok[200005];
vector<long long> edge[2000005], p, d;
bool add(long long sz, long long x) {
  for (long long i = sz - 1; i >= 0; i--) {
    if (x & c[i]) {
      if (b[i])
        x ^= b[i];
      else {
        b[i] = x;
        return 1;
      }
    }
  }
  return 0;
}
void dfs(long long u, long long mx) {
  p.push_back(u);
  vis[u] = now;
  for (auto v : edge[u]) {
    if (vis[v] == now || v > mx) continue;
    dfs(v, mx);
  }
}
void check(long long sz) {
  memset(b, 0, sizeof(b));
  d.clear();
  p.clear();
  for (long long i = 0; i < c[sz]; i++) {
    edge[i].clear();
  }
  for (long long i = 1; i <= n; i++) {
    if (add(sz, a[i])) d.push_back(a[i]);
  }
  if (d.size() != sz) return;
  for (long long i = 0; i < c[sz]; i++) {
    for (auto j : d) {
      edge[i].push_back(j ^ i);
    }
  }
  dfs(0, c[sz] - 1);
  if (p.size() != c[sz]) return;
  printf("%lld\n", sz);
  for (auto i : p) {
    printf("%lld ", i);
  }
  printf("\n");
  exit(0);
}
int main() {
  scanf("%lld", &n);
  c[0] = 1;
  for (long long i = 1; i <= 60; i++) {
    c[i] = c[i - 1] * 2;
  }
  for (long long i = 1; i <= n; i++) {
    scanf("%lld", &a[i]);
    ok[a[i]] = 1;
  }
  sort(a + 1, a + 1 + n);
  for (long long i = 20; i >= 0; i--) {
    check(i);
    now++;
  }
}
