#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>

#define max 100005 

using namespace std;

int n,m,timer;
bool visited[max];
int prenum[max],parent[max],lowest[max];
vector<int> G[max];
set<int> S;

void dfs(int current, int prev) {
	prenum[current]=lowest[current]=timer;
	timer++;
	visited[current]=true;
	
	int next,i;
	
	for(i=0;i<G[current].size();i++) {
		next=G[current][i];
		if(visited[next]==false) {
			parent[next]=current;
			
			dfs(next,current);
			
			lowest[current]=min(lowest[current],lowest[next]);
		} else if(next!=prev) {
			lowest[current]=min(lowest[current],prenum[next]);
		}
	}
}

void art_Points() {
	int i;
	for(i=0;i<n;i++) {
		visited[i]=false;
	}
	timer=1;
	
	dfs(0,-1);
	
	int np=0;
	
	for(i=1;i<n;i++) {
		int p=parent[i];
		if(p==0) np++;
		else if(prenum[p]<=lowest[i]) S.insert(p);
	}
	if(np>=2) S.insert(0);
	for(set<int>::iterator it=S.begin();it!=S.end();it++) {
		cout<<*it<<endl;
	}
}

int main() {
	int i,d1,d2;
	
	scanf("%d %d",&n,&m);
	
	for(i=0;i<m;i++) {
		scanf("%d %d",&d1,&d2);
		G[d1].push_back(d2);
		G[d2].push_back(d1);
	}
	
	art_Points();
	
	return 0;
}
