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;
}