import hashlib
import importlib.util
import json
import os
import pathlib
from types import ModuleType

import pytest
import requests

lowerCAmelCase__					=				pathlib.Path.cwd().joinpath('project_euler')
lowerCAmelCase__					=				pathlib.Path.cwd().joinpath(
    'scripts', 'project_euler_answers.json'
)

with open(PROJECT_EULER_ANSWERS_PATH) as file_handle:
    lowerCAmelCase__					=				json.load(file_handle)






def    __lowerCamelCase	(		lowerCAmelCase__			):
       lowerCAmelCase__  			=      importlib.util.spec_from_file_location(file_path.name			,						str(lowerCAmelCase__			)			)
       lowerCAmelCase__  			=      importlib.util.module_from_spec(lowerCAmelCase__			)  # type: ignore
       spec.loader.exec_module(lowerCAmelCase__			)  # type: ignore
       return module






def    __lowerCamelCase	(		):
       lowerCAmelCase__  			=      []
       for problem_dir_path in PROJECT_EULER_DIR_PATH.iterdir():
              if problem_dir_path.is_file() or problem_dir_path.name.startswith('_'			):
                     continue
              for file_path in problem_dir_path.iterdir():
                     if file_path.suffix != ".py" or file_path.name.startswith(('_', 'test')			):
                            continue
                     solution_file_paths.append(lowerCAmelCase__			)
       return solution_file_paths






def    __lowerCamelCase	(		):
       with open(os.environ['GITHUB_EVENT_PATH']			) as file:
              lowerCAmelCase__  			=      json.load(lowerCAmelCase__			)
       return event["pull_request"]["url"] + "/files"






def    __lowerCamelCase	(		):
       lowerCAmelCase__  			=      []
       lowerCAmelCase__  			=      {
           'Accept': 'application/vnd.github.v3+json',
           'Authorization': 'token ' + os.environ['GITHUB_TOKEN'],
       }
       lowerCAmelCase__  			=      requests.get(get_files_url()			,						headers=lowerCAmelCase__			).json()
       for file in files:
              lowerCAmelCase__  			=      pathlib.Path.cwd().joinpath(file['filename']			)
              if (
                  filepath.suffix != ".py"
                  or filepath.name.startswith(('_', 'test')			)
                  or not filepath.name.startswith('sol'			)
              ):
                     continue
              solution_file_paths.append(lowerCAmelCase__			)
       return solution_file_paths






def    __lowerCamelCase	(		):
       if os.environ.get('CI'			) and os.environ.get('GITHUB_EVENT_NAME'			) == "pull_request":
              # Return only if there are any, otherwise default to all solutions
              if filepaths := added_solution_file_path():
                     return filepaths
       return all_solution_file_paths()






@pytest.mark.parametrize(
    'solution_path'			,						collect_solution_file_paths()			,						ids=lambda lowerCAmelCase__			: F"""{path.parent.name}/{path.name}"""			,						)
def    __lowerCamelCase	(		lowerCAmelCase__			):
       lowerCAmelCase__  			=      solution_path.parent.name[8:].zfill(3			)
       lowerCAmelCase__  			=      PROBLEM_ANSWERS[problem_number]
       lowerCAmelCase__  			=      convert_path_to_module(lowerCAmelCase__			)
       lowerCAmelCase__  			=      str(solution_module.solution()			)  # type: ignore
       lowerCAmelCase__  			=      hashlib.shaaaa(answer.encode()			).hexdigest()
       assert (
           answer == expected
       ), F"""Expected solution to {problem_number} to have hash {expected}, got {answer}"""

from __future__ import annotations






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






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






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


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

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

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