Find articulation points of a given undirected graph G(V, E).

A vertex in an undirected graph is an articulation point (or cut vertex) iff removing it disconnects the graph.

Constraints

* 1 ≤ |V| ≤ 100,000
* 0 ≤ |E| ≤ 100,000
* The graph is connected
* There are no parallel edges
* There are no self-loops

Input


|V| |E|
s0 t0
s1 t1
:
s|E|-1 t|E|-1


, where |V| is the number of vertices and |E| is the number of edges in the graph. The graph vertices are named with the numbers 0, 1,..., |V|-1 respectively.

si and ti represent source and target verticess of i-th edge (undirected).

Output

A list of articulation points of the graph G ordered by name.

Examples

Input

4 4
0 1
0 2
1 2
2 3


Output

2


Input

5 4
0 1
1 2
2 3
3 4


Output

1
2
3
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
static const int MAX = 100000;
#define ROOT 0

vector<int> G[MAX];
bool visited[MAX];
int prenum[MAX];
int lowest[MAX];
int parents[MAX];
bool is_artpoint[MAX];
int NCHILD_ROOT = 0;

void visit(int n, int parent) {
  static int v = 0;
  visited[n] = true;
  prenum[n] = v++;
  parents[n] = parent;
}

void judge_parent(int n) {
  if (n != ROOT && parents[n] == ROOT)
    NCHILD_ROOT++;

  if (prenum[parents[n]] <= lowest[n])
    is_artpoint[parents[n]] = true;
}

int calc_lowest(int n, int childmin) {
  int l = min(childmin, prenum[n]);
  for (auto i : G[n]) {
    if (i != parents[n])
      l = min(l, prenum[i]);
  }
  return l;
}

int dfs(int n, int parent) {
  int childmin = MAX;
  visit(n, parent);
  for (auto i : G[n]) {
    if (!visited[i])
      childmin = min(childmin, dfs(i, n));
  }
  lowest[n] = calc_lowest(n, childmin);
  judge_parent(n);
  return lowest[n];
}

int main() {
  int nv, ne;
  cin >> nv >> ne;
  for (int i = 0; i < ne; i++) {
    int s, t;
    cin >> s >> t;
    G[s].push_back(t);
    G[t].push_back(s);
  }
  for (int i = 0; i < nv; i++) {
    visited[i] = false;
    is_artpoint[i] = false;
  }

  dfs(ROOT, ROOT);

  is_artpoint[ROOT] = NCHILD_ROOT >= 2;

  for (int i = 0; i < nv; i++) {
    if (is_artpoint[i])
      cout << i << endl;
  }
}