output_description: A list of _articulation points_ of the graph G ordered by name.
input_description: |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).
attempt: import sys
  
  sys.setrecursionlimit(10**7)
  
  v, e = list(map(int, input().split()))
  
  G = [[] for _ in range(v)]
  for _ in range(e):
      s, t = map(int, input().split())
      G[s].append(t)
      G[t].append(s)
  
  
  def solve():
  
      used = [False for _ in range(v)]
      ord = [0 for _ in range(v)]
      low = [float("inf") for _ in range(v)]
      is_articulation = [False for _ in range(v)]
  
      def dfs(v, prev, k):
          if used[v]:
              return
          used[v] = True
          k = k + 1
          ord[v] = k
          low[v] = ord[v]
          cnt = 0
          for u in G[v]:
              if not used[u]:
                  cnt += 1
                  dfs(u, v, k)
                  low[v] = min(low[v], low[u])
                  if prev >= 0 and ord[v] <= low[u]:
                      is_articulation[v] = True
              elif u != prev:
                  low[v] = min(low[v], ord[u])
          if prev == -1 and cnt >= 2:
              is_articulation[v] = True
  
          return k
  
      dfs(0, -1, 0)
  
      for i in range(v):
          if is_articulation[i]:
              print(i)
  
  
  solve()
  
problem_description: 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.
samples: [{"input": "4 4\n    0 1\n    0 2\n    1 2\n    2 3", "output": "2"}, {"input": "5 4\n    0 1\n    1 2\n    2 3\n    3 4", "output": "1\n    2\n    3"}]