new_contents: # n - no of nodes, m - no of edges
  n, m = list(map(int,input().split()))
  
  g = [[] for i in range(n)] #graph
  r = [[] for i in range(n)] #reversed graph
  # input graph data (edges)
  for i in range(m):
      u, v = list(map(int,input().split()))
      g[u].append(v)
      r[v].append(u)
  
  stack = []
  visit = [False]*n
  scc = []
  component = []
  
  def dfs(u):
      global g, r, scc, component, visit, stack
      if visit[u]: return
      visit[u] = True
      for v in g[u]:
          dfs(v)
      stack.append(u)
  
  def dfs2(u):
      global g, r, scc, component, visit, stack
      if visit[u]: return
      visit[u] = True
      component.append(u)
      for v in r[u]:
          dfs2(v)
  
  def kosaraju():
      global g, r, scc, component, visit, stack
      for i in range(n):
          dfs(i)
      visit = [False]*n
      for i in stack[::-1]:
          if visit[i]: continue
          component = []
          dfs2(i)
          scc.append(component)
      return scc
  
  print(kosaraju())
  
subject: Create scc_kosaraju.py