#include <bits/stdc++.h>
using namespace std;
const int maxn = 266666;
inline int read() {
  int x = 0, f = 0;
  char ch = getchar();
  while (ch < '0' || ch > '9') f |= ch == '-', ch = getchar();
  while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar();
  return f ? -x : x;
}
int n, s[maxn], lb[20], vec[20], vl, ans, seq[maxn], sl;
bool vis[maxn], ok;
void insert(int x) {
  int tmp = x;
  for (int i = (19); i >= (0); i--)
    if ((x >> i) & 1) {
      if (!lb[i]) {
        lb[i] = x;
        vec[++vl] = tmp;
        return;
      } else
        x ^= lb[i];
    }
}
bool check(int x) {
  for (int i = (0); i <= (x - 1); i++)
    if (!lb[i]) return false;
  return true;
}
void dfs(int x) {
  vis[x] = true;
  seq[++sl] = x;
  if (sl == (1 << ans)) {
    ok = true;
    return;
  }
  for (int i = (1); i <= (vl); i++)
    if (!vis[x ^ vec[i]]) {
      dfs(x ^ vec[i]);
      if (ok) return;
    }
  vis[x] = false;
  sl--;
}
int main() {
  n = read();
  for (int i = (1); i <= (n); i++) s[i] = read();
  for (int _ = (19); _ >= (0); _--) {
    memset(lb, 0, sizeof(lb));
    memset(vec, 0, sizeof(vec));
    vl = 0;
    for (int i = (1); i <= (n); i++)
      if (s[i] <= (1 << _) - 1) insert(s[i]);
    if (check(_)) {
      ans = _;
      break;
    }
  }
  printf("%d\n", ans);
  dfs(0);
  for (int i = (1); i <= (sl); i++) printf("%d ", seq[i]);
}
