output_description: A list of _bridges_ of the graph ordered by name. For each bridge, names of
  its end-ponints, source and target (source < target), should be printed
  separated by a space. The sources should be printed ascending order, then the
  target should also be printed ascending order for the same source.
input_description: |V| |E|
      s0 t0
      s1 t1
      :
      s|E|-1 t|E|-1
      
  
  , where |V| is the number of nodes and |E| is the number of edges in the
  graph. The graph nodes are named with the numbers 0, 1,..., |V|-1
  respectively.
  
  si and ti represent source and target nodes of i-th edge (undirected).
attempt: import sys
  
  sys.setrecursionlimit(10**6)
  
  V, E = list(map(int, input().split()))
  G = [[] for i in range(V)]
  
  for i in range(E):
      s, t = list(map(int, input().split()))
      G[s].append(t)
      G[t].append(s)
  
  
  class LowLink:
      def main(G, V):
          LowLink.G = G
          LowLink.used = [False] * V
          LowLink.ord = [0] * V
          LowLink.low = [0] * V
          LowLink.aps = []
          LowLink.bridges = []
          n = 0
  
          for i in range(V):
              if not LowLink.used[i]:
                  n = LowLink.dfs(i, n, -1)
  
          LowLink.aps.sort()
          LowLink.bridges.sort()
  
      def dfs(v, n, par):
          LowLink.used[v] = True
          LowLink.ord[v] = n + 1
          n += 1
          LowLink.low[v] = LowLink.ord[v]
  
          is_aps = False
          chi = 0
  
          for u in LowLink.G[v]:
              if not LowLink.used[u]:
                  chi += 1
                  n = LowLink.dfs(u, n, v)
                  LowLink.low[v] = min(LowLink.low[v], LowLink.low[u])
                  if par != -1 and LowLink.ord[v] <= LowLink.low[u]:
                      is_aps = True
                  if LowLink.ord[v] < LowLink.low[u]:
                      LowLink.bridges.append((min(v, u), max(v, u)))
  
              elif u != par:
                  LowLink.low[v] = min(LowLink.low[v], LowLink.ord[u])
  
          if par == -1 and chi >= 2:
              is_aps = True
          if is_aps:
              LowLink.aps.append(v)
  
          return n
  
  
  LowLink.main(G, V)
  
  for v in LowLink.bridges:
      print(*v)
  
problem_description: Bridges
  
  Find bridges of an undirected graph G(V, E).
  
  A bridge (also known as a cut-edge) is an edge whose deletion increase the
  number of connected components.
samples: [{"input": "4 4\n    0 1\n    0 2\n    1 2\n    2 3", "output": "2 3"}, {"input": "5 4\n    0 1\n    1 2\n    2 3\n    3 4", "output": "0 1\n    1 2\n    2 3\n    3 4"}]