#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef int lint;
const lint maxn = 5000 + 100;
const lint maxm = 50000000 + 100;
lint lowbit( lint x ){
return x & -x;
}
bool judge(int a, int b) {
a ^= b;
a ^= lowbit(a);
return a != 0;
}
lint a[maxn];
lint color[maxn], v[maxn];
struct bpm {
lint he[maxn],ne[maxm],ver[maxm],tot;
lint match[maxn],S[maxn],T[maxn],n,vis[maxn];
void init( lint n ){ //n必须恰好为左部点和右部点的和
this->n = n;
for( lint i = 0;i <= n;i++ ) match[i] = S[i] = T[i] = 0;
for( lint i = 0;i <= n;i++ ) he[i] = 0;
tot = 1;
}
void add( lint x,lint y ){
ver[++tot] = y;
ne[tot] = he[x];
he[x] = tot;
ver[++tot] = x;
ne[tot] = he[y];
he[y] = tot;
}
bool dfs(lint x) {
vis[x] = 1;
for (lint cure = he[x]; cure; cure = ne[cure]) {
lint y = ver[cure];
if (!T[y]) {
vis[y] = T[y] = 1;
if (!match[y] || dfs(match[y])) {
match[y] = x;
return true;
}
}
}
return false;
}
lint solve( const vector<lint>&ve ){ //ve存储左部点
lint ans = 0;
for( lint i = 0;i < ve.size();i++ ){
for( lint i = 0;i <= n;i++ ) T[i] = 0;
if( dfs(ve[i]) ) ans++;
}
return ans;
}
lint duli( const vector<lint>& ss, const vector<lint>& tt, vector<lint>& ans ){ // ss 存储左部点 tt存储右部点 ans返回点独立集
lint res = n - solve(ss);
ans.clear();
for( lint i = 0;i <= n;i++ ) vis[i] = 0;
for( lint i =0;i < tt.size();i++ ){
if( match[ tt[i] ] ) S[ match[tt[i]] ] = 1;
}
for( lint i = 0;i <= n;i++ ) T[i] = 0;
for( lint i = 0;i < ss.size();i++ ){
if( !S[ ss[i] ] ) {
dfs( ss[i] );
}
}
for( lint i = 0;i < ss.size();i++ ){
if( vis[ss[i] ] ) ans.push_back( ss[i] );
}
for( lint i = 0;i < tt.size();i++ ){
if( !vis[ tt[i] ] ) ans.push_back( tt[i] );
}
return res;
}
lint mincover( const vector<lint>& ss, const vector<lint>& tt, vector<lint>& ans1,vector<lint>& ans2 ){ // ss 存储左部点 tt存储右部点 ans返回点独立集
lint res = solve(ss); // ans1存储左部点的答案,ans2存储右部点的答案
ans1.clear();ans2.clear();
for( lint i = 0;i <= n;i++ ) vis[i] = 0;
for( lint i =0;i < tt.size();i++ ){
if( match[ tt[i] ] ) S[ match[tt[i]] ] = 1;
}
for( lint i = 0;i <= n;i++ ) T[i] = 0;
for( lint i = 0;i < ss.size();i++ ){
if( !S[ ss[i] ] ) {
dfs( ss[i] );
}
}
for( lint i = 0;i < ss.size();i++ ){
if( !vis[ss[i] ] ) ans1.push_back( ss[i] );
}
for( lint i = 0;i < tt.size();i++ ){
if( vis[ tt[i] ] ) ans2.push_back( tt[i] );
}
return res;
}
}g;
void dfs(lint x, lint c) {
v[x] = 1;
color[x] = c;
for (lint cure = g.he[x]; cure; cure = g.ne[cure]) {
lint y = g.ver[cure];
if (v[y]) continue;
dfs(y, c ^ 1);
}
}
vector<lint> ve,ans,ves,vet;
int main(){
lint n;
scanf("%d",&n);
for( int i = 1;i <= n;i++ ){
scanf("%d",&a[i]);
}
g.init(n);
for( int i = 1;i <= n;i++ ){
for( int j = i+1;j <= n;j++ ){
if( !judge( a[i],a[j] ) ){
g.add( i,j );
}
}
}
for( lint i = 1;i <= n;i++ ){
if(v[i]) continue;
dfs(i,1);
}
for( lint i = 1;i <= n;i++ ){
if( color[i] == 1 ){
ves.push_back(i);
}else vet.push_back(i);
}
g.duli( ves,vet,ans );
printf("%d\n",ans.size());
printf("%d",a[ans[0]]);
for( lint i = 1;i < ans.size();i++ ){
printf(" %d",a[ans[i]]);
}
return 0;
}