


from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

_lowerCAmelCase:						Dict   				=       TypeVar('T')




class       lowercase_					(Generic[T]   ):





				def __init__(				self       ,  lowercase_ = True)  -> None:
											a__      ={}  # dictionary of lists
											a__      =directed





				def 						__UpperCamelCase    (				self       ,  lowercase_       ,  lowercase_)  -> GraphAdjacencyList[T]:

											if not self.directed:  # For undirected graphs
																		# if both source vertex and destination vertex are both present in the
																		# adjacency list, add destination vertex to source vertex list of adjacent
																		# vertices and add source vertex to destination vertex list of adjacent
																		# vertices.
																		if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																									self.adj_list[source_vertex].append(lowerCAmelCase_)
																									self.adj_list[destination_vertex].append(lowerCAmelCase_)
																		# if only source vertex is present in adjacency list, add destination vertex
																		# to source vertex list of adjacent vertices, then create a new vertex with
																		# destination vertex as key and assign a list containing the source vertex
																		# as it's first adjacent vertex.
																		elif source_vertex in self.adj_list:
																									self.adj_list[source_vertex].append(lowerCAmelCase_)
																									a__      =[source_vertex]
																		# if only destination vertex is present in adjacency list, add source vertex
																		# to destination vertex list of adjacent vertices, then create a new vertex
																		# with source vertex as key and assign a list containing the source vertex
																		# as it's first adjacent vertex.
																		elif destination_vertex in self.adj_list:
																									self.adj_list[destination_vertex].append(lowerCAmelCase_)
																									a__      =[destination_vertex]
																		# if both source vertex and destination vertex are not present in adjacency
																		# list, create a new vertex with source vertex as key and assign a list
																		# containing the destination vertex as it's first adjacent vertex also
																		# create a new vertex with destination vertex as key and assign a list
																		# containing the source vertex as it's first adjacent vertex.
																		else:
																									a__      =[destination_vertex]
																									a__      =[source_vertex]
											else:  # For directed graphs
																		# if both source vertex and destination vertex are present in adjacency
																		# list, add destination vertex to source vertex list of adjacent vertices.
																		if source_vertex in self.adj_list and destination_vertex in self.adj_list:
																									self.adj_list[source_vertex].append(lowerCAmelCase_)
																		# if only source vertex is present in adjacency list, add destination
																		# vertex to source vertex list of adjacent vertices and create a new vertex
																		# with destination vertex as key, which has no adjacent vertex
																		elif source_vertex in self.adj_list:
																									self.adj_list[source_vertex].append(lowerCAmelCase_)
																									a__      =[]
																		# if only destination vertex is present in adjacency list, create a new
																		# vertex with source vertex as key and assign a list containing destination
																		# vertex as first adjacent vertex
																		elif destination_vertex in self.adj_list:
																									a__      =[destination_vertex]
																		# if both source vertex and destination vertex are not present in adjacency
																		# list, create a new vertex with source vertex as key and a list containing
																		# destination vertex as it's first adjacent vertex. Then create a new vertex
																		# with destination vertex as key, which has no adjacent vertex
																		else:
																									a__      =[destination_vertex]
																									a__      =[]

											return self





				def __repr__(				self)  -> str:
											return pformat(self.adj_list)









"""simple docstring"""
def 				lowercase__		(					lowerCamelCase,						lowerCamelCase       ):
				return abs(lowerCamelCase       ) if a == 0 else greatest_common_divisor(b % a,						lowerCamelCase       )





def 				lowercase__		(					lowerCamelCase,						lowerCamelCase       ):
				while y:  # --> when y=0 then loop will terminate and return x as final GCD.
								_SCREAMING_SNAKE_CASE		,						_SCREAMING_SNAKE_CASE   :		Optional[Any]       		=    y, x % y
				return abs(lowerCamelCase       )





def 				lowercase__		(					):
				try:
								_SCREAMING_SNAKE_CASE   :		Union[str, Any]       		=    input('Enter two integers separated by comma (,): '       ).split(','       )
								_SCREAMING_SNAKE_CASE   :		Dict       		=    int(nums[0]       )
								_SCREAMING_SNAKE_CASE   :		Dict       		=    int(nums[1]       )
								print(
								    f"""greatest_common_divisor({num_a}, {num_a}) = """
								    f"""{greatest_common_divisor(lowerCamelCase,						lowerCamelCase       )}"""       )
								print(f"""By iterative gcd({num_a}, {num_a}) = {gcd_by_iterative(lowerCamelCase,						lowerCamelCase       )}"""       )
				except (IndexError, UnboundLocalError, ValueError):
								print('Wrong input'       )


if __name__ == "__main__":
			main()

