#include<bits/stdc++.h>
#define N 5050
using namespace std;
typedef struct
{
int to,next;
long long flow;
bool is_match;
}ss;
ss edg[64*N];
int now_edge=0,s,t;
int head[N];
void addedge(int u,int v)
{
edg[now_edge]=(ss){v,head[u],0};
head[u]=now_edge++;
}
void addedge(int u,int v,long long flow)
{
// printf("%d %d\n",u,v);
edg[now_edge]=(ss){v,head[u],flow};
head[u]=now_edge++;
edg[now_edge]=(ss){u,head[v],0};
head[v]=now_edge++;
}
int dis[N];
bool bfs()
{
memset(dis,0,sizeof(dis));
queue<int>q;
q.push(s);
dis[s]=1;
while(!q.empty())
{
int now=q.front();
q.pop();
for(int i=head[now];i!=-1;i=edg[i].next)
{
ss &e=edg[i];
if(e.flow>0&&dis[e.to]==0)
{
dis[e.to]=dis[now]+1;
q.push(e.to);
}
}
}
if(dis[t]==0)return 0;
return 1;
}
int current[N];
long long dfs(int x,long long maxflow)
{
if(x==t)return maxflow;
for(int i=current[x];i!=-1;i=edg[i].next)
{
current[x]=i;
ss &e=edg[i];
if(e.flow>0&&dis[e.to]==dis[x]+1)
{
long long flow=dfs(e.to,min(maxflow,e.flow));
if(flow!=0)
{
e.flow-=flow;
edg[i^1].flow+=flow;
return flow;
}
}
}
return 0;
}
long long dinic()//最大流
{
long long ans=0,flow;
while(bfs())
{
for(int i=0;i<N;i++)current[i]=head[i];
while(flow=dfs(s,LLONG_MAX/2))ans+=flow;
}
return ans;
}
void init()
{
for(int i=0;i<N;i++)head[i]=-1;
now_edge=0;
}
int arr[N];
int color[N]={0};
void Bipartite_graph_coloring(int x,int now_color)//二分圖染色
{
if(color[x])return;
color[x]=now_color;
for(int i=head[x];i!=-1;i=edg[i].next)Bipartite_graph_coloring(edg[i].to,now_color*-1);
}
bool is_match_vertex[N]={0};
int is_ans[N]={0};
void dfs(int x,int type)//尋找最小點覆蓋集中的點,不在該集合中的點就是最大點獨立集的點
{
if(is_ans[x])return;
is_ans[x]=1;
for(int i=head[x];i!=-1;i=edg[i].next)
{
int v=edg[i].to;
if(v==s||v==t)continue;
if(edg[i].is_match==(bool)type)dfs(v,1-type);
}
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&arr[i]);
init();
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
int now=arr[i]^arr[j];
if(now==(now&-now))
{
addedge(i,j);
addedge(j,i);
// printf("%d %d\n",arr[i],arr[j]);
}
}
}
for(int i=1;i<=n;i++)
if(!color[i])Bipartite_graph_coloring(i,1);//先將圖劃分紅二分圖
/* for(int i=1;i<=n;i++)if(color[i]==1)printf("%d ",arr[i]);
printf("\n");
for(int i=1;i<=n;i++)if(color[i]==-1)printf("%d ",arr[i]);
printf("\n");*/
init();
s=n+1,t=s+1;
for(int i=1;i<=n;i++)
{
if(color[i]==1)addedge(s,i,1);
else
addedge(i,t,1);
if(color[i]==1)
{
for(int j=1;j<=n;j++)
{
int now=arr[i]^arr[j];
if(now==(now&-now))
{
addedge(i,j,1);//建邊準備跑二分圖匹配
}
}
}
}
int ans=n-dinic();
printf("%d\n",ans);
for(int i=1;i<=n;i++)
{
if(color[i]==1)
{
for(int j=head[i];j!=-1;j=edg[j].next)
{
if(edg[j].to!=s&&edg[j^1].flow)
{
edg[j].is_match=edg[j^1].is_match=true;
is_match_vertex[i]=is_match_vertex[edg[j].to]=true;
}
else
{
edg[j].is_match=edg[j^1].is_match=false;
}
}
}
}
for(int i=1;i<=n;i++)
{
if(color[i]==-1&&is_match_vertex[i]==false)
{
dfs(i,0);
}
}
for(int i=1;i<=n;i++)
{
if(color[i]==1&&!is_ans[i]||color[i]==-1&&is_ans[i])printf("%d%c",arr[i],--ans==0 ? '\n': ' ');
}
return 0;
}