#include <bits/stdc++.h>
using namespace std;
int n;
vector<int> v;
vector<int> g;
vector<int> w;
void ins(int val) {
  int form = val;
  for (int el : g) {
    val = min(val, (el ^ val));
  }
  if (val) {
    g.push_back(val);
    w.push_back(form);
  }
}
vector<int> gray(int dep) {
  if (dep == 1) {
    vector<int> ret;
    ret.push_back(0);
    ret.push_back(1);
    return ret;
  }
  if (dep == 0) {
    vector<int> ret;
    ret.push_back(0);
    return ret;
  }
  vector<int> lef = gray(dep - 1);
  vector<int> rig = lef;
  reverse(rig.begin(), rig.end());
  for (int i = 0; i < rig.size(); i++) {
    rig[i] ^= (1 << (dep - 1));
  }
  for (int el : rig) {
    lef.push_back(el);
  }
  return lef;
}
vector<int> enc;
bool ok(int c) {
  w.clear();
  g.clear();
  for (int i = 0; i < v.size(); i++) {
    if ((v[i] >> c) != 0) continue;
    ins(v[i]);
  }
  if (g.size() == c) {
    return true;
  }
  return false;
}
int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    int a;
    scanf("%d", &a);
    v.push_back(a);
  }
  sort(v.begin(), v.end());
  for (int i = 0; i < v.size(); i++) {
    ins(v[i]);
  }
  sort(g.begin(), g.end());
  int maxi = 0;
  sort(w.begin(), w.end());
  for (int i = 32; i >= 0; i--) {
    if (ok(i)) {
      maxi = i;
      break;
    }
  }
  enc = gray(maxi);
  cout << maxi << endl;
  for (int j = 0; j < enc.size(); j++) {
    int xo = 0;
    for (int k = 0; k < maxi; k++) {
      if ((enc[j] >> k) & 1) {
        xo ^= w[k];
      }
    }
    if (j) printf(" ");
    printf("%d", xo);
  }
  puts("");
  return 0;
}
