#include #include #include using namespace std;int head[1000005],low[1000005],dfn[1000005],cut[1000005],n,m,cnt,time;struct edge{ int v,next;}e[1000005];inline void add(int u,int v){ e[++cnt].v=v; e[cnt].next=head[u]; head[u]=cnt;}inline void tarjan(int u,int fa){ low[u]=dfn[u]=++time; int child=0; for(int i=head[u];i!=-1;i=e[i].next){ int v=e[i].v; if(!dfn[v]){ tarjan(v,fa); low[u]=min(low[u],low[v]); if(low[v]>=dfn[u]&&u!=fa)cut[u]=1; if(u==fa)child++; } low[u]=min(low[u],dfn[v]); } if(child>=2&&u==fa)cut[u]=1;}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++){ int x,y; scanf("%d%d",&x,&y); add(x,y);add(y,x); } for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,i); int ans=0; for(int i=1;i<=n;i++){ if(cut[i])ans++; } printf("%d\n",ans); for(int i=1;i<=n;i++){ if(cut[i])printf("%d ",i); }}