#include <bits/stdc++.h>
int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); }
using namespace ::std;
const long long maxn = 5e5 + 500;
const long long logg = 20;
long long koj[logg];
vector<long long> num;
vector<long long> rnum;
vector<long long> operator+(vector<long long> a, vector<long long> b) {
  for (auto v : b) a.push_back(v);
  return a;
}
void clearr() {
  memset(koj, -1, sizeof koj);
  num.clear();
  rnum.clear();
}
void add(long long x) {
  long long rx = x;
  for (long long i = 0; i < logg; i++) {
    if ((x >> i) & 1) {
      if (koj[i] == -1) {
        koj[i] = num.size();
        num.push_back(x);
        rnum.push_back(rx);
        return;
      } else {
        x ^= num[koj[i]];
      }
    }
  }
}
void bild() {
  long long n = num.size();
  vector<long long> vec;
  for (auto v : rnum) {
    vector<long long> r;
    r.push_back(v);
    vec = ((vec + r) + vec);
  }
  long long v = 0;
  cout << n << endl;
  for (auto u : vec) {
    cout << v << ' ';
    v ^= u;
  }
  cout << v << endl;
}
long long a[maxn];
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n;
  cin >> n;
  for (long long i = 0; i < n; i++) {
    cin >> a[i];
  }
  n++;
  for (long long u = logg - 1; u >= 0; u--) {
    clearr();
    for (long long i = 0; i < n; i++) {
      if (a[i] < (1 << u)) {
        add(a[i]);
      }
    }
    if ((long long)num.size() == u) {
      bild();
      return 0;
    }
  }
}
