1 #include<bits/stdc++.h>
2 using namespace std;
3 typedef long long ll;
4
5 int n,m;
6 const int maxn=1e5+2;
7 const int maxm=maxn<<1;
8 struct node
9 {
10 int to;
11 int nxt;
12 }e[maxm];
13 int head[maxn];
14 int tot;
15 int id;
16 int root;
17 int low[maxn];
18 int num[maxn];
19 bool vis[maxn];
20 int pa[maxn];
21 int cnt=0;
22 int art[maxn];
23 void init()
24 {
25 memset(head,-1,sizeof(head));
26 tot=0;
27 id=0;
28 memset(low,-1,sizeof(low));
29 memset(num,-1,sizeof(num));
30 memset(vis,false,sizeof(vis));
31 memset(pa,-1,sizeof(pa));
32 cnt=0;
33 memset(art,0,sizeof(art));
34 }
35 void add(int u,int v)
36 {
37 e[tot].to=v;
38 e[tot].nxt=head[u];
39 head[u]=tot++;
40 }
41 void findArt(int u)
42 {
43 vis[u]=true;
44 low[u]=num[u]=++id;
45 for(int i=head[u];i!=-1;i=e[i].nxt)
46 {
47 int v=e[i].to;
48 //树边
49 if(!vis[v])
50 {
51 pa[v]=u;
52 findArt(v);
53 if(low[v]>=num[u]&&u!=root)
54 {
55 art[cnt++]=u;
56 }
57 low[u]=min(low[u],low[v]);
58 }
59 else if(pa[v]!=u) //回退边
60 {
61 low[u]=min(low[u],num[v]);
62 }
63 }
64 }
65
66 void printArt()
67 {
68 int tmp=0;
69 for(int i=head[root];i!=-1;i=e[i].nxt)
70 {
71 if(pa[e[i].to]==root) tmp++;
72 }
73 if(tmp>=2) art[cnt++]=root;
74 for(int i=0;i<cnt;i++)
75 {
76 printf("%d ",art[i]);
77 }
78 puts("");
79 }
80
81 int main()
82 {
83 while(~scanf("%d%d",&n,&m))
84 {
85 init();
86 int u,v;
87 for(int i=1;i<=m;i++)
88 {
89 scanf("%d%d",&u,&v);
90 add(u,v);
91 add(v,u);
92 }
93 root=1;
94 findArt(root);
95 printArt();
96 }
97 return 0;
98 }