#include <bits/stdc++.h>
#pragma GCC omptimize("unroll-loops")
#pragma optimize("SEX_ON_THE_BEACH")
using namespace std;
using ll = long long int;
using ull = unsigned long long int;
using dd = long double;
using ldd = long double;
using si = short int;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
ll get_seed(string s) {
  ll ans = 0;
  for (int i = 0; i < s.size(); ++i) ans += s[i];
  return ans;
}
vector<int> base, temp;
void push(int x) {
  int t = x;
  for (int i : base) t = min(t, t ^ i);
  if (t) {
    base.push_back(t);
    temp.push_back(x);
    for (int i = base.size() - 1; i > 0; --i) {
      if (base[i] > base[i - 1])
        swap(base[i], base[i - 1]);
      else
        break;
    }
  }
}
bool check(int x, vector<int>& arr) {
  base.clear();
  temp.clear();
  for (int i : arr) {
    if (i < (1 << x)) push(i);
  }
  return base.size() == x;
}
void ans_is(int x) {
  cout << x << '\n';
  vector<int> ans(1, 0);
  for (int i = 0; i < x; ++i) {
    for (int j = (1 << i) - 1; j >= 0; --j) ans.push_back(ans[j] ^ temp[i]);
  }
  for (int i : ans) cout << i << " ";
  exit(0);
}
void solve() {
  int n;
  cin >> n;
  vector<int> arr(n);
  for (int i = 0; i < n; ++i) cin >> arr[i];
  for (int i = 20; i >= 0; --i) {
    if (check(i, arr)) ans_is(i);
  }
}
int main() {
  ios_base::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  int t = 1;
  for (int i = 0; i < t; ++i) solve();
  return 0;
}
