#include <bits/stdc++.h>
#define ll long long
#define U unsigned
using namespace std;
struct my_edge{
int head[20005],nex[100005],to[100005],size;
void push(int u,int v){
nex[++size]=head[u];
to[size]=v;
head[u]=size;
}
void clear(){
size=0;
memset(head,0,sizeof head);
}
}G;
int n,m,u,v,dfn[20005],tot,low[20005],cut[20005],num,root;
void tarjan(int u){
dfn[u]=low[u]=++tot;
int v,c;
for(int i=G.head[u];i;i=G.nex[i]){
v=G.to[i];
if(dfn[v]){
low[u]=min(low[u],dfn[v]);
}else{
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<=low[v]){
c++;
if(u!=root||c>1){
if(!cut[u])num++;
cout<<(u!=root)<<' ';
cut[u]=1;
}
}
}
}
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin>>n>>m;
while(m--){
cin>>u>>v;
G.push(u,v);
G.push(v,u);
}
for(root=1; root<=n; root++)
if(!dfn[root])tarjan(root);
cout<<num<<'\n';
for(int i=1;i<=n;i++){
if(cut[i]){
cout<<i<<' ';
}
}
return 0;
}