//Tarjan 割点 //根节点满足子节点个数>=2即为割点 //非根节点满足dfn[u]<=low[v]时u即为割点 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> using namespace std; int n,m,cnt,ans,head[100001]; int dot,dfn[100001],low[100001]; int cut[100001]; struct uio{ int to,next; }edge[200001]; void add(int x,int y) { edge[++cnt].next=head[x]; edge[cnt].to=y; head[x]=cnt; } void tarjan(int x,int fa) { int child=0; dfn[x]=low[x]=++dot; for(int i=head[x];i;i=edge[i].next) { int y=edge[i].to; if(!dfn[y]) { tarjan(y,x); low[x]=min(low[x],low[y]); if(low[y]>=dfn[x]&&x!=fa) cut[x]=1; if(x==fa) child++; } low[x]=min(low[x],dfn[y]); } if(child>=2&&x==fa) cut[x]=1; } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v); add(v,u); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i,i); for(int i=1;i<=n;i++) if(cut[i]) ans++; printf("%d ",ans); for(int i=1;i<=n;i++) if(cut[i]) printf("%d ",i); return 0; }