#include<bits/stdc++.h>
using namespace std;
const int M=1e5+10;
int n,m,H[M];
vector<int>g[M];
bool cv[M],mark[M];
int dfs(int v,int par,int h)
{
  int up=h,cnt=0;
  mark[v]=true;
  H[v]=h;
  if(g[v].size()==1 && v!=1)return h;
  for(auto u:g[v])
    if(!mark[u])
      {
	cnt++;
	int d=dfs(u,v,h+1);
	//cout<<v<<" "<<u<<" "<<d<<endl;
	up=min(up,d);
	if(d>=h)cv[v]=true;
      }
    else if(u!=par)
      up=min(up,H[u]);
  if(v==1)
    if(cnt>1)cv[v]=true;
    else cv[v]=false;
  return up;
}
int main()
{
  cin>>n>>m;
  for(int i=0;i<m;i++)
    {
      int u,v;
      cin>>u>>v;
      u++;v++;
      g[u].push_back(v);
      g[v].push_back(u);
    }
  dfs(1,1,0);
  for(int i=1;i<=n;i++)
    if(cv[i])cout<<i-1<<endl;
  return 0;
}