text: 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
  
  
  if __name__ == "__main__":
      # n - no of nodes, m - no of edges
      n, m = list(map(int,input().strip().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().strip().split()))
          g[u].append(v)
          r[v].append(u)
  
      stack = []
      visit = [False]*n
      scc = []
      component = []
      print(kosaraju())
  