#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
double eps = 1e-8;
vector<int> b, c;
int vis[2100000], a[210000], ans[210000], x;
int read() {
  int v = 0, f = 1;
  char c = getchar();
  while (c < 48 || 57 < c) {
    if (c == '-') f = -1;
    c = getchar();
  }
  while (48 <= c && c <= 57) v = (v << 3) + v + v + c - 48, c = getchar();
  return v * f;
}
void ins(int u) {
  int t = u;
  for (int &v : b) u = min(u, u ^ v);
  if (u) {
    b.push_back(u);
    c.push_back(t);
    for (int i = (int)(int)b.size() - 1; i >= (int)1; i--)
      if (b[i] > b[i - 1])
        swap(b[i], b[i - 1]);
      else
        break;
  }
}
void dfs(int u, int s) {
  ans[s] = u;
  vis[u] = 1;
  if (s == (1 << x) - 1) return;
  for (int &v : c)
    if (!vis[u ^ v]) {
      dfs(u ^ v, s + 1);
      return;
    }
}
int main() {
  int n = read();
  for (int i = (int)1; i <= (int)n; i++) a[i] = read();
  sort(a + 1, a + n + 1);
  x = 0;
  int j = 1;
  for (int i = (int)1; i <= (int)19; i++) {
    while (j <= n && a[j] <= ((1 << i) - 1)) {
      ins(a[j]);
      j++;
    }
    if (b.size() == i) x = i;
  }
  b.clear();
  c.clear();
  for (int i = (int)1; i <= (int)n; i++)
    if (a[i] <= ((1 << x) - 1))
      ins(a[i]);
    else
      break;
  dfs(0, 0);
  printf("%d\n", x);
  for (int i = (int)0; i <= (int)(1 << x) - 1; i++) printf("%d ", ans[i]);
  return 0;
}
