/*表示割点模板很难理解。。。。
但是呢,可以将整个图用深搜来一步步递归。。
dfn[x]<=low[tmp] && x!=mr的点就++;
完毕。。。。
PS:小心第一个节点。。。
可能是一个二叉树结构*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200100
using namespace std;
int p[maxn],h[maxn],v[maxn],dfn[maxn],low[maxn],cut[maxn],tot=0,x,y,n,m,k=0;
void add(int x,int y){
p[++k]=y,v[k]=h[x],h[x]=k;
}
void tarjan(int x,int mr){
int rc=0;
dfn[x]=low[x]=++tot;
for (int i=h[x]; i; i=v[i])
{
int tmp=p[i];
if (!dfn[tmp]){
tarjan(tmp,mr);
low[x]=min(low[tmp],low[x]);
if (dfn[x]<=low[tmp] && x!=mr) cut[x]=1;
if (x==mr) rc++;
}
low[x]=min(low[x],dfn[tmp]);
}
if (x==mr && rc>=2) cut[x]=1;
}
int main(){
scanf("%d%d",&n,&m);
for (int i=1; i<=m; i++){
scanf("%d%d",&x,&y);
add(x,y);
add(y,x);
}
for (int i=1; i<=n; i++){
if (!dfn[i]) tarjan(i,i);}
long long ans=0;
for (int i=1; i<=n; i++) if (cut[i]) ans++;
printf("%lld\n",ans);
for (int i=1; i<=n; i++) if (cut[i]) printf("%d ",i);
return 0;
}