




from __future__ import annotations

from queue import Queue




def 							_UpperCAmelCase     (UpperCamelCase_       :       int					,			UpperCamelCase_       :       int				):
				'''simple docstring'''
				a ^= b
				b ^= a
				a ^= b
				return a, b




def 							_UpperCAmelCase     (UpperCamelCase_       :       int					,			UpperCamelCase_       :       list[list[int]]				):
				'''simple docstring'''
				_lowerCAmelCase			:			int        =					1
				while (1 << j) < max_node:
								for i in range(1					,			max_node + 1				):
												_lowerCAmelCase			:			List[Any]        =					parent[j - 1][parent[j - 1][i]]
								j += 1
				return parent




def 							_UpperCAmelCase     (UpperCamelCase_       :       int					,			UpperCamelCase_       :       int					,			UpperCamelCase_       :       list[int]					,			UpperCamelCase_       :       list[list[int]]				):
				'''simple docstring'''
				# u must be deeper in the tree than v
				if level[u] < level[v]:
								_lowerCAmelCase    ,			_lowerCAmelCase			:			Optional[int]        =					swap(UpperCamelCase_					,			UpperCamelCase_				)
				# making depth of u same as depth of v
				for i in range(18					,			-1					,			-1				):
								if level[u] - (1 << i) >= level[v]:
												_lowerCAmelCase			:			Any        =					parent[i][u]
    # at the same depth if u==v that mean lca is found
				if u == v:
								return u
				# moving both nodes upwards till lca in found
				for i in range(18					,			-1					,			-1				):
								if parent[i][u] not in [0, parent[i][v]]:
												_lowerCAmelCase    ,			_lowerCAmelCase			:			Tuple        =					parent[i][u], parent[i][v]
    # returning longest common ancestor of u,v
				return parent[0][u]




def 							_UpperCAmelCase     (UpperCamelCase_       :       list[int]					,			UpperCamelCase_       :       list[list[int]]					,			UpperCamelCase_       :       int					,			UpperCamelCase_       :       dict[int, list[int]]					,			UpperCamelCase_       :       int = 1					,			):
				'''simple docstring'''
				_lowerCAmelCase			:			int        =					0
				_lowerCAmelCase			:			Queue[int]        =					Queue(maxsize=UpperCamelCase_				)
				q.put(UpperCamelCase_				)
				while q.qsize() != 0:
								_lowerCAmelCase			:			List[str]        =					q.get()
								for v in graph[u]:
												if level[v] == -1:
																_lowerCAmelCase			:			Tuple        =					level[u] + 1
																q.put(UpperCamelCase_				)
																_lowerCAmelCase			:			Union[str, Any]        =					u
				return level, parent




def 							_UpperCAmelCase     ():
				'''simple docstring'''
				_lowerCAmelCase			:			Dict        =					13
				# initializing with 0
				_lowerCAmelCase			:			Dict        =					[[0 for _ in range(max_node + 10				)] for _ in range(20				)]
				# initializing with -1 which means every node is unvisited
				_lowerCAmelCase			:			Union[str, Any]        =					[-1 for _ in range(max_node + 10				)]
				_lowerCAmelCase			:			dict[int, list[int]]        =					{
				    1: [2, 3, 4],
				    2: [5],
				    3: [6, 7],
				    4: [8],
				    5: [9, 10],
				    6: [11],
				    7: [],
				    8: [12, 13],
				    9: [],
				    10: [],
				    11: [],
				    12: [],
				    13: [],
				}
				_lowerCAmelCase    ,			_lowerCAmelCase			:			Optional[Any]        =					breadth_first_search(UpperCamelCase_					,			UpperCamelCase_					,			UpperCamelCase_					,			UpperCamelCase_					,			1				)
				_lowerCAmelCase			:			Union[str, Any]        =					create_sparse(UpperCamelCase_					,			UpperCamelCase_				)
				print("""LCA of node 1 and 3 is: """					,			lowest_common_ancestor(1					,			3					,			UpperCamelCase_					,			UpperCamelCase_				)				)
				print("""LCA of node 5 and 6 is: """					,			lowest_common_ancestor(5					,			6					,			UpperCamelCase_					,			UpperCamelCase_				)				)
				print("""LCA of node 7 and 11 is: """					,			lowest_common_ancestor(7					,			11					,			UpperCamelCase_					,			UpperCamelCase_				)				)
				print("""LCA of node 6 and 7 is: """					,			lowest_common_ancestor(6					,			7					,			UpperCamelCase_					,			UpperCamelCase_				)				)
				print("""LCA of node 4 and 12 is: """					,			lowest_common_ancestor(4					,			12					,			UpperCamelCase_					,			UpperCamelCase_				)				)
				print("""LCA of node 8 and 8 is: """					,			lowest_common_ancestor(8					,			8					,			UpperCamelCase_					,			UpperCamelCase_				)				)


if __name__ == "__main__":
	main()



"""simple docstring"""

from __future__ import annotations




def 			lowercase__  (    lowerCAmelCase :    Dict       )       ->					Optional[int]:






    """simple docstring"""




    global graph, reversed_graph, scc, component, visit, stack
    if visit[u]:
        return
    UpperCAmelCase  	=    True
    for v in graph[u]:
        dfs(lowerCAmelCase       )
    stack.append(lowerCAmelCase       )




def 			lowercase__  (    lowerCAmelCase :    Optional[int]       )       ->					int:






    """simple docstring"""




    global graph, reversed_graph, scc, component, visit, stack
    if visit[u]:
        return
    UpperCAmelCase  	=    True
    component.append(lowerCAmelCase       )
    for v in reversed_graph[u]:
        dfsa(lowerCAmelCase       )




def 			lowercase__  (    )       ->					List[str]:






    """simple docstring"""




    global graph, reversed_graph, scc, component, visit, stack
    for i in range(lowerCAmelCase       ):
        dfs(lowerCAmelCase       )
    UpperCAmelCase  	=    [False] * n
    for i in stack[::-1]:
        if visit[i]:
            continue
        UpperCAmelCase  	=    []
        dfsa(lowerCAmelCase       )
        scc.append(lowerCAmelCase       )
    return scc


if __name__ == "__main__":
   # n - no of nodes, m - no of edges
   SCREAMING_SNAKE_CASE_    ,  SCREAMING_SNAKE_CASE_			    =  list(map(int, input().strip().split()))

   SCREAMING_SNAKE_CASE_			    =  [[] for _ in range(n)]  # graph
   SCREAMING_SNAKE_CASE_			    =  [[] for i in range(n)]  # reversed graph
   # input graph data (edges)
   for _ in range(m):
      SCREAMING_SNAKE_CASE_    ,  SCREAMING_SNAKE_CASE_			    =  list(map(int, input().strip().split()))
      graph[u].append(v)
      reversed_graph[v].append(u)

   SCREAMING_SNAKE_CASE_			    =  []
   SCREAMING_SNAKE_CASE_			    =  [False] * n
   SCREAMING_SNAKE_CASE_			    =  []
   SCREAMING_SNAKE_CASE_			    =  []
   print(kosaraju())



