
# Author: OMKAR PATHAK, Nwachukwu Chidiebere

# Use a Python dictionary to construct the graph.
from __future__ import annotations

from pprint import pformat
from typing import Generic, TypeVar

lowerCamelCase__          =		TypeVar("""T""")







class      A__							(     Generic[T]	):






				def __init__(						self					:      Optional[int]    ,     a					:      bool = True   ):






							'''simple docstring'''







							lowerCAmelCase__      :      dict[T, list[T]]         =		{}  # dictionary of lists
							lowerCAmelCase__      :      Union[str, Any]         =		directed






				def 							_lowerCamelCase		(						self					:      Optional[Any]    ,     a					:      T    ,     a					:      T   ):






							'''simple docstring'''







							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(a   )
													self.adj_list[destination_vertex].append(a   )
										# 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(a   )
													lowerCAmelCase__      :      Dict         =		[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(a   )
													lowerCAmelCase__      :      List[str]         =		[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:
													lowerCAmelCase__      :      Union[str, Any]         =		[destination_vertex]
													lowerCAmelCase__      :      Any         =		[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(a   )
										# 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(a   )
													lowerCAmelCase__      :      List[str]         =		[]
										# 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:
													lowerCAmelCase__      :      str         =		[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:
													lowerCAmelCase__      :      List[Any]         =		[destination_vertex]
													lowerCAmelCase__      :      Dict         =		[]

							return self






				def __repr__(						self					:      List[str]   ):






							'''simple docstring'''







							return pformat(self.adj_list   )

import os
from distutils.util import strtobool
def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_     )				->		Optional[Any]:
			for e in env_keys:
						lowerCAmelCase__      :      Union[str, Any]         =		int(os.environ.get(SCREAMING_SNAKE_CASE_       ,							-1     )     )
						if val >= 0:
									return val
			return default
def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_=False     )				->		List[str]:
			lowerCAmelCase__      :      Optional[int]         =		os.environ.get(SCREAMING_SNAKE_CASE_       ,							str(SCREAMING_SNAKE_CASE_     )     )
			return strtobool(SCREAMING_SNAKE_CASE_     ) == 1  # As its name indicates `strtobool` actually returns an int...







def  lowerCAmelCase__			(  SCREAMING_SNAKE_CASE_       ,							SCREAMING_SNAKE_CASE_="no"     )				->		List[str]:
			lowerCAmelCase__      :      Optional[int]         =		os.environ.get(SCREAMING_SNAKE_CASE_       ,							str(SCREAMING_SNAKE_CASE_     )     )
			return value