P1003
#include <bits/stdc++.h>
const int N = 200010, M = 500010;
int n, m;
int head[N], nxt[M << 1], to[M << 1], idx = 0;
int fa[N], sons[N], dfn[N], low[N], tsp;
bool iscut[N];
int ans;
void add(int u, int v) {
nxt[idx] = head[u];
to[idx] = v;
head[u] = idx;
++ idx;
return;
}
void dfsearch(int x) {
++ tsp;
low[x] = dfn[x] = tsp;
for (int i = head[x]; i != -1; i = nxt[i]) {
int e = to[i];
if (e == fa[x]) {
continue;
}
if (dfn[e] == 0) {
fa[e] = x;
++ sons[x];
dfsearch(e);
low[x] = std::min(low[x], low[e]);
} else {
low[x] = std::min(low[x], dfn[e]);
}
}
if (fa[x] == -1 && sons[x] >= 2) {
if (!iscut[x]) {
++ ans;
}
iscut[x] = true;
} else if (fa[x] != -1 && fa[fa[x]] != -1 && low[x] >= dfn[fa[x]]) {
if (!iscut[fa[x]]) {
++ ans;
}
iscut[fa[x]] = true;
}
return;
}
int main(void) {
memset(head, -1, sizeof(head));
int inpu, inpv;
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; ++ i) {
scanf("%d%d", &inpu, &inpv);
add(inpu, inpv);
add(inpv, inpu);
}
tsp = 0;
for (int i = 1; i <= n; ++ i) {
if (dfn[i] == 0) {
fa[i] = -1;
dfsearch(i);
}
}
printf("%d\n", ans);
for (int i = 1; i <= n; ++ i) {
if (iscut[i]) {
printf("%d ", i);
}
}
return 0;
}