#include <bits/stdc++.h>
using namespace std;
template <typename T, typename V>
ostream &operator<<(ostream &os, const pair<T, V> pai) {
  return os << pai.first << ' ' << pai.second;
}
template <typename T>
ostream &operator<<(ostream &os, const vector<T> v) {
  for (int i = 0, _i = (((int)(v).size())); i < _i; i++) cout << v[i] << ' ';
  return os;
}
template <typename T>
ostream &operator<<(ostream &os, const set<T> s) {
  for (T p : s) cout << p << ' ';
  return os;
}
template <typename T, typename V>
ostream &operator<<(ostream &os, const map<T, V> s) {
  for (auto p : s) cout << '(' << p << ") ";
  return os;
}
template <typename T, typename V>
istream &operator>>(istream &is, pair<T, V> &pai) {
  is >> pai.first >> pai.second;
  return is;
}
template <typename T>
void umax(T &a, T b) {
  a = max(a, b);
}
template <typename T>
void umin(T &a, T b) {
  a = min(a, b);
}
int N;
int A[200000];
int B[200000];
int D[18];
vector<int> li;
int convert(int x) {
  int ret = 0;
  for (int i = 0, _i = (18); i < _i; i++)
    if ((x >> i) & 1) ret ^= li[i];
  return ret;
}
int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
  cin >> N;
  for (int i = 0, _i = (N); i < _i; i++) cin >> A[i];
  sort(A, A + N);
  copy(A, A + N, B);
  for (int i = 0, _i = (N); i < _i; i++) {
    for (int j = 17; j >= 0; j--) {
      if (not((B[i] >> j) & 1)) continue;
      if (D[j])
        B[i] ^= D[j];
      else {
        li.push_back(A[i]);
        D[j] = B[i];
        break;
      }
    }
  }
  int T = find(D, D + 18, 0) - D;
  cout << T << '\n';
  for (int i = 0, _i = (1 << T); i < _i; i++) {
    int r = 0;
    for (int j = 0, _j = (T); j < _j; j++)
      if (((i ^ (i >> 1)) >> j) & 1) r ^= li[j];
    cout << r << ' ';
  }
  cout << '\n';
}
