Skip to content
c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
constexpr int N=20005;
std::vector<int>g[N];
int dfn[N],low[N],tot;
bool cut[N];
int n,m;
void tarjan(int u, bool root) {
    dfn[u] = low[u] = ++tot;
    int son = 0;
    for (int v : g[u]) {
        if (!dfn[v]) {
            son++;
            tarjan(v, false);
            low[u] = min(low[u], low[v]); 
            if (low[v] >= dfn[u] && (!root || son >= 2)) cut[u] = true;
        } else {
            low[u] = min(low[u], dfn[v]); // 弃边 dfn[v] > dfn[u] 不影响最小值
        }
    } 
}
void fc() {
    std::cin>>n>>m;
    for(int i=0;i<m;i++){
        int u,v;std:;cin>>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }

    for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,true);
    
    std::cout<<std::count(cut+1,cut+n+1,true)<<"\n";
    for(int i=1;i<=n;i++){
        if(cut[i])std::cout<<i<<" ";
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //std::cin>>t;
    while (t--) fc();
    return 0;
}