Problem:
Articulation Points

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.

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.

Constraints

1 ≤ |V| ≤ 100,000

0 ≤ |E| ≤ 100,000

The graph is connected

There are no parallel edges

There are no self-loops

Sample Input 1

4 4
0 1
0 2
1 2
2 3

Sample Output 1

2

Sample Input 2

5 4
0 1
1 2
2 3
3 4

Sample Output 2

1
2
3

Solution in C++ (judge verdict: Time Limit Exceeded)

// http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=GRL_3_A&lang=jp
// ??±???????????§???????????????????????£???????????¢?´¢?????????????????????????????£????????¢????????¨???????????¨?????????
// ???????????????O(v^2)
#include <bits/stdc++.h>
using namespace std;
int graph[100000];
vector<int> edge[100000];
int v, e, s, t;
void dfs(int now) {
    graph[now] = 1;
    for (int i=0; i<edge[now].size(); i++) {
        if (graph[edge[now][i]] == 0) {
            dfs(edge[now][i]);
        }
    }
}
int main() {
    scanf("%d%d",&v,&e);
    for (int i=0; i<e; i++) {
        scanf("%d%d",&s,&t);
        edge[s].push_back(t);
        edge[t].push_back(s);
    }
    if (v==1) {
    } else {
        for (int i=0; i<v; i++) {
            memset(graph, 0, sizeof(graph));
            graph[i] = 1;
            dfs(edge[i][0]);
            int sum = 0;
            for (int j=0; j<v; j++) sum += graph[j];
            if (sum != v) printf("%d\n",i);
        }
    }
}