





import unittest

from transformers import ErnieMTokenizer
from transformers.testing_utils import get_tests_dir, require_sentencepiece, require_tokenizers, slow

from ...test_tokenization_common import TokenizerTesterMixin


UpperCAmelCase						:       Optional[Any]        =					get_tests_dir('''fixtures/spiece.model''')





@require_sentencepiece
@require_tokenizers
class 						_A( lowerCAmelCase__    ,			unittest.TestCase       ):


				"""simple docstring"""


				UpperCamelCase   :  Union[str, Any]    =     ErnieMTokenizer
				UpperCamelCase   :  Dict    =     False
				UpperCamelCase   :  List[Any]    =     True
				UpperCamelCase   :  Tuple    =     False
				UpperCamelCase   :  Union[str, Any]    =     False



				def  UpperCAmelCase_		(      self					):
									super().setUp()

									# We have a SentencePiece fixture for testing
									__A     :						Any          =    ErnieMTokenizer(_A					, unk_token='<unk>'					, pad_token='<pad>'					)
									tokenizer.save_pretrained(self.tmpdirname					)



				def  UpperCAmelCase_		(      self					, _A					):
									__A     :						Optional[Any]          =    '''this is a test'''
									__A     :						Union[str, Any]          =    '''this is a test'''
									return input_text, output_text



				def  UpperCAmelCase_		(      self					):
									__A     :						str          =    '''<pad>'''
									__A     :						int          =    0

									self.assertEqual(self.get_tokenizer()._convert_token_to_id(_A					)					, _A					)
									self.assertEqual(self.get_tokenizer()._convert_id_to_token(_A					)					, _A					)



				def  UpperCAmelCase_		(      self					):
									__A     :						List[Any]          =    list(self.get_tokenizer().get_vocab().keys()					)

									self.assertEqual(vocab_keys[0]					, '<pad>'					)
									self.assertEqual(vocab_keys[1]					, '<unk>'					)
									self.assertEqual(vocab_keys[-1]					, '▁eloquent'					)
									self.assertEqual(len(_A					)					, 30000					)



				def  UpperCAmelCase_		(      self					):
									self.assertEqual(self.get_tokenizer().vocab_size					, 30000					)



				def  UpperCAmelCase_		(      self					):




									if not self.test_rust_tokenizer:
														return

									__A     :						Optional[Any]          =    self.get_tokenizer()
									__A     :						Dict          =    self.get_rust_tokenizer()

									__A     :						Union[str, Any]          =    '''I was born in 92000, and this is falsé.'''

									__A     :						Tuple          =    tokenizer.tokenize(_A					)
									__A     :						Optional[Any]          =    rust_tokenizer.tokenize(_A					)
									self.assertListEqual(_A					, _A					)

									__A     :						Tuple          =    tokenizer.encode(_A					, add_special_tokens=_A					)
									__A     :						int          =    rust_tokenizer.encode(_A					, add_special_tokens=_A					)
									self.assertListEqual(_A					, _A					)

									__A     :						Optional[Any]          =    self.get_rust_tokenizer()
									__A     :						Optional[int]          =    tokenizer.encode(_A					)
									__A     :						int          =    rust_tokenizer.encode(_A					)
									self.assertListEqual(_A					, _A					)



				def  UpperCAmelCase_		(      self					):
									__A     :						Optional[int]          =    ErnieMTokenizer(_A					, do_lower_case=_A					, unk_token='<unk>'					, pad_token='<pad>'					)

									__A     :						Dict          =    tokenizer.tokenize('This is a test'					)
									self.assertListEqual(_A					, ['▁this', '▁is', '▁a', '▁test']					)

									self.assertListEqual(tokenizer.convert_tokens_to_ids(_A					)					, [48, 25, 21, 1289]					)

									__A     :						List[Any]          =    tokenizer.tokenize('I was born in 92000, and this is falsé.'					)
									# ErnieMTokenizer(paddlenlp implementation) outputs '9' instead of '_9' so to mimic that '_9' is changed to '9'
									self.assertListEqual(
									    _A					, ['▁i', '▁was', '▁born', '▁in', '9', '2000', ',', '▁and', '▁this', '▁is', '▁fal', 's', 'é', '.']					)
									__A     :						Dict          =    tokenizer.convert_tokens_to_ids(_A					)
									self.assertListEqual(_A					, [31, 23, 386, 19, 518, 3050, 15, 17, 48, 25, 8256, 18, 1, 9]					)

									__A     :						int          =    tokenizer.convert_ids_to_tokens(_A					)
									self.assertListEqual(
									    _A					, ['▁i', '▁was', '▁born', '▁in', '9', '2000', ',', '▁and', '▁this', '▁is', '▁fal', 's', '<unk>', '.']					, )



				def  UpperCAmelCase_		(      self					):
									__A     :						Dict          =    ErnieMTokenizer(_A					, unk_token='<unk>'					, pad_token='<pad>'					)

									__A     :						int          =    tokenizer.encode('sequence builders'					)
									__A     :						List[Any]          =    tokenizer.encode('multi-sequence build'					)

									__A     :						List[Any]          =    tokenizer.build_inputs_with_special_tokens(_A					)
									__A     :						Tuple          =    tokenizer.build_inputs_with_special_tokens(_A					, _A					)

									assert encoded_sentence == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id]
									assert encoded_pair == [tokenizer.cls_token_id] + text + [tokenizer.sep_token_id] + [
									    tokenizer.sep_token_id
									] + text_a + [tokenizer.sep_token_id]





				@slow
				def  UpperCAmelCase_		(      self					):
									__A     :						Tuple          =    {'''input_ids''': [[0, 11062, 82772, 7, 15, 82772, 538, 51529, 237, 17198, 1290, 206, 9, 215175, 1314, 136, 17198, 1290, 206, 9, 56359, 42, 122009, 9, 16466, 16, 87344, 4537, 9, 4717, 78381, 6, 159958, 7, 15, 24480, 618, 4, 527, 22693, 9, 304, 4, 2777, 24480, 9874, 4, 43523, 594, 4, 803, 18392, 33189, 18, 4, 43523, 24447, 5, 5, 5, 16, 100, 24955, 83658, 9626, 144057, 15, 839, 22335, 16, 136, 24955, 83658, 83479, 15, 39102, 724, 16, 678, 645, 6460, 1328, 4589, 42, 122009, 115774, 23, 3559, 1328, 46876, 7, 136, 53894, 1940, 42227, 41159, 17721, 823, 425, 4, 27512, 98722, 206, 136, 5531, 4970, 919, 17336, 5, 2], [0, 20080, 618, 83, 82775, 47, 479, 9, 1517, 73, 53894, 333, 80581, 110117, 18811, 5256, 1295, 51, 152526, 297, 7986, 390, 124416, 538, 35431, 214, 98, 15044, 25737, 136, 7108, 43701, 23, 756, 135355, 7, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [0, 581, 63773, 119455, 6, 147797, 88203, 7, 645, 70, 21, 3285, 10269, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]}
									# fmt: on

									self.tokenizer_integration_test_util(
									    expected_encoding=_A					, model_name='susnato/ernie-m-base_pytorch'					, sequences=[
									        'Transformers (formerly known as pytorch-transformers and pytorch-pretrained-bert) provides '
									        'general-purpose architectures (BERT, GPT-2, RoBERTa, XLM, DistilBert, XLNet...) for Natural '
									        'Language Understanding (NLU) and Natural Language Generation (NLG) with over32+ pretrained '
									        'models in100+ languages and deep interoperability between Jax, PyTorch and TensorFlow.',
									        'BERT is designed to pre-train deep bidirectional representations from unlabeled text by jointly '
									        'conditioning on both left and right context in all layers.',
									        'The quick brown fox jumps over the lazy dog.',
									    ]					, )











from __future__ import annotations







def 			_SCREAMING_SNAKE_CASE    (       a  )				->				List[str]:
					global graph, reversed_graph, scc, component, visit, stack
					if visit[u]:
										return
					__A     :						List[Any]          =    True
					for v in graph[u]:
										dfs(a  )
					stack.append(a  )







def 			_SCREAMING_SNAKE_CASE    (       a  )				->				Optional[Any]:
					global graph, reversed_graph, scc, component, visit, stack
					if visit[u]:
										return
					__A     :						str          =    True
					component.append(a  )
					for v in reversed_graph[u]:
										dfsa(a  )







def 			_SCREAMING_SNAKE_CASE    (       )				->				Optional[int]:
					global graph, reversed_graph, scc, component, visit, stack
					for i in range(a  ):
										dfs(a  )
					__A     :						str          =    [False] * n
					for i in stack[::-1]:
										if visit[i]:
															continue
										__A     :						Optional[Any]          =    []
										dfsa(a  )
										scc.append(a  )
					return scc


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

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

				UpperCAmelCase						:       list[int]        =					[]
				UpperCAmelCase						:       list[bool]        =					[False] * n
				UpperCAmelCase						:       list[int]        =					[]
				UpperCAmelCase						:       list[int]        =					[]
				print(kosaraju())




