#include <iostream>
#include <vector>
#include <stack>
using namespace std;
int MAX_N = 10005;
vector<int> adj[10005];
int V ,E, found[10005], cut[10005]; // 발견된 순서
int counter = 0;
// here : 현재 탐색중인 위치
// return 현재 탐색중인 노드를 루트로 하는 sub graph가 방문할 수 있는
// 최상위 위치(=발견 순서의 최솟값)
int dfs(int here, int is_root) {
found[here] = ++counter; // 발견 순서 저장
int low = found[here];
int next, child = 0;
for (int i = 0; i < (int)adj[here].size(); ++i) {
next = adj[here][i];
if (found[next] == 0) { // 미방문 노드
++child;
int sub = dfs(next, false);
if (!is_root && sub >= found[here]) { // 단절점 조건
cut[here] = true;
}
if (sub < low) low = sub; // low 갱신
} else { // 이미 방문한 노드
if (found[next] < low) {
low = found[next];
}
}
}
// root 노드에 대한 별도 처리
if (is_root && child >= 2) cut[here] = true;
return low;
}
int main() {
scanf("%d %d", &V , &E);
for (int i = 0 ; i < E ; i ++){
int a,b;
scanf("%d %d", &a,&b);
adj[a].push_back(b);
adj[b].push_back(a);
}
while(1){
int start=-1;
for (int i =1 ; i <= V ; i++) {
if ( found[i] == 0 ) {
start= i;
break;
}
}
if ( start == -1) break;
if (start == 1 ) dfs(start,1);
else dfs(start,0);
}
int cut_count=0;
for (int i =1 ; i <= V ; i++){
if(cut[i]== true ) cut_count++;
}
cout << cut_count << "\n";
for (int i =1 ; i <= V ; i++){
if(cut[i]== true ) cout << i << " ";
}
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0YWNrPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IE1BWF9OID0gMTAwMDU7Cgp2ZWN0b3I8aW50PiBhZGpbMTAwMDVdOwppbnQgViAsRSwgZm91bmRbMTAwMDVdLCBjdXRbMTAwMDVdOyAgICAvLyDrsJzqsqzrkJwg7Iic7IScCmludCBjb3VudGVyID0gMDsKCi8vIGhlcmUgOiDtmITsnqwg7YOQ7IOJ7KSR7J24IOychOy5mAovLyByZXR1cm4g7ZiE7J6sIO2DkOyDieykkeyduCDrhbjrk5zrpbwg66Oo7Yq466GcIO2VmOuKlCBzdWIgZ3JhcGjqsIAg67Cp66y47ZWgIOyImCDsnojripQKLy8g7LWc7IOB7JyEIOychOy5mCg967Cc6rKsIOyInOyEnOydmCDstZzshp/qsJIpCmludCBkZnMoaW50IGhlcmUsIGludCBpc19yb290KSB7CiAgICBmb3VuZFtoZXJlXSA9ICsrY291bnRlcjsgICAgLy8g67Cc6rKsIOyInOyEnCDsoIDsnqUKCiAgICBpbnQgbG93ID0gZm91bmRbaGVyZV07CiAgICBpbnQgbmV4dCwgY2hpbGQgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KWFkaltoZXJlXS5zaXplKCk7ICsraSkgewogICAgICAgIG5leHQgPSBhZGpbaGVyZV1baV07CgogICAgICAgIGlmIChmb3VuZFtuZXh0XSA9PSAwKSB7ICAgICAvLyDrr7jrsKnrrLgg64W465OcCiAgICAgICAgICAgICsrY2hpbGQ7CiAgICAgICAgICAgIGludCBzdWIgPSBkZnMobmV4dCwgZmFsc2UpOwoKICAgICAgICAgICAgaWYgKCFpc19yb290ICYmIHN1YiA+PSBmb3VuZFtoZXJlXSkgeyAgIC8vIOuLqOygiOygkCDsobDqsbQKICAgICAgICAgICAgICAgIGN1dFtoZXJlXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN1YiA8IGxvdykgbG93ID0gc3ViOyAgIC8vIGxvdyDqsLHsi6AKICAgICAgICB9IGVsc2UgeyAgICAgICAgLy8g7J2066+4IOuwqeusuO2VnCDrhbjrk5wKICAgICAgICAgICAgaWYgKGZvdW5kW25leHRdIDwgbG93KSB7CiAgICAgICAgICAgICAgICBsb3cgPSBmb3VuZFtuZXh0XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyByb290IOuFuOuTnOyXkCDrjIDtlZwg67OE64+EIOyymOumrAogICAgaWYgKGlzX3Jvb3QgJiYgY2hpbGQgPj0gMikgY3V0W2hlcmVdID0gdHJ1ZTsKCiAgICByZXR1cm4gbG93Owp9CgppbnQgbWFpbigpIHsKCiAgICBzY2FuZigiJWQgJWQiLCAmViAsICZFKTsKCiAgICBmb3IgKGludCBpID0gMCA7IGkgPCBFIDsgaSArKyl7CiAgICAgICAgaW50IGEsYjsKICAgICAgICBzY2FuZigiJWQgJWQiLCAmYSwmYik7CiAgICAgICAgYWRqW2FdLnB1c2hfYmFjayhiKTsKICAgICAgICBhZGpbYl0ucHVzaF9iYWNrKGEpOwogICAgfQogICAgCiAgICB3aGlsZSgxKXsKICAgIAlpbnQgc3RhcnQ9LTE7CiAgICAgICAgZm9yIChpbnQgaSA9MSAgOyBpIDw9IFYgOyBpKyspIHsKICAgICAgICAgICAgaWYgKCBmb3VuZFtpXSA9PSAwICkgewogICAgICAgICAgICAgICAgc3RhcnQ9IGk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIHN0YXJ0ID09IC0xKSBicmVhazsKICAgICAgICAKICAgICAgICBpZiAoc3RhcnQgPT0gMSApIGRmcyhzdGFydCwxKTsKICAgICAgICBlbHNlIGRmcyhzdGFydCwwKTsKICAgICAgICAKICAgIH0KICAgIAogICAgaW50IGN1dF9jb3VudD0wOwogICAgZm9yIChpbnQgaSA9MSAgOyBpIDw9IFYgOyBpKyspewogICAgCWlmKGN1dFtpXT09IHRydWUgKSBjdXRfY291bnQrKzsKICAgIH0KICAgIGNvdXQgPDwgY3V0X2NvdW50IDw8ICJcbiI7CiAgICAgZm9yIChpbnQgaSA9MSAgOyBpIDw9IFYgOyBpKyspewogICAgCWlmKGN1dFtpXT09IHRydWUgKSBjb3V0IDw8IGkgPDwgIiAiOwogICAgfQogICAgCiAgICByZXR1cm4gMDsKfQ==