#include <bits/stdc++.h>
using namespace std;
const int MAX = (int)2e5 + 10;
vector<int> getBasis(vector<bitset<MAX>> mat, vector<int> const& a) {
  vector<int> basis;
  for (int i = 0, j = 0; i < MAX; i++) {
    for (int k = j; k < 21; k++) {
      if (mat[k][i]) swap(mat[j], mat[k]);
    }
    if (mat[j][i]) {
      basis.push_back(a[i]);
      for (int k = j + 1; k < 21; k++) {
        if (mat[k][i]) mat[k] ^= mat[j];
      }
      j++;
    }
  }
  return basis;
}
vector<int> path;
void getPath(int x) {
  if (x == 0) {
    return;
  }
  getPath(x - 1);
  path.push_back(x - 1);
  getPath(x - 1);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n;
  cin >> n;
  vector<int> a(n, 0);
  for (int i = 0; i < n; i++) {
    cin >> a[i];
  }
  sort(a.begin(), a.end());
  int m = 0;
  vector<bitset<MAX>> mat(21, bitset<MAX>(0));
  vector<int> basis;
  for (int i = 1, j = 0; i < 21 && j < n; i++) {
    for (; j < n && a[j] < (1 << i); j++) {
      for (int k = 0; k < 21; k++) {
        if (a[j] & (1 << k)) {
          mat[k][j] = 1;
        }
      }
    }
    vector<int> curis = getBasis(mat, a);
    if ((int)curis.size() == i) {
      m = i;
      basis = curis;
    }
  }
  getPath(m);
  vector<int> ans = {0};
  for (int i = 0; i < (int)path.size(); i++) {
    ans.push_back(ans.back() ^ basis[path[i]]);
  }
  cout << m << '\n';
  for (int i = 0; i < (int)ans.size(); i++) {
    cout << ans[i] << ' ';
  }
  cout << '\n';
  return 0;
}
