#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2e5 + 500;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int LOG = 18;
const double EPS = 1e-9;
const double PI = 3.1415926535;
const int OFF = 1 << 17;
vector<int> spanning_set, gauss, basis;
bool reverse_sort(const int& a, const int& b) { return a > b; }
void add(int u) {
  int tmp = u;
  for (auto v : gauss) u = min(u, u ^ v);
  if (u == 0) return;
  basis.push_back(tmp);
  gauss.push_back(u);
  sort(gauss.begin(), gauss.end(), reverse_sort);
}
void gray_code(int sz) {
  vector<int> solution = {0};
  for (int i = 0; i < sz; i++) {
    for (int j = solution.size() - 1; j >= 0; j--)
      solution.push_back(solution[j] ^ basis[i]);
  }
  for (auto elem : solution) printf("%d ", elem);
  printf("\n");
}
int main() {
  int N, elem, sz, iter = 0;
  scanf("%d", &N);
  for (int i = 0; i < N; i++) {
    scanf("%d", &elem);
    spanning_set.push_back(elem);
  }
  sort(spanning_set.begin(), spanning_set.end());
  for (int i = 0; i < 20; i++) {
    for (; spanning_set[iter] < (1 << i) && iter < N; iter++)
      add(spanning_set[iter]);
    if (gauss.size() == i) sz = i;
  }
  basis.clear();
  spanning_set.clear();
  for (int i = 0; spanning_set[i] < (1 << sz) && i < N; i++)
    add(spanning_set[i]);
  printf("%d\n", sz);
  gray_code(sz);
  return 0;
}
