graph = {
	1: {
		2: 7,
		3: 9,
		6: 14
	},
	2: {
		1: 7,
		3: 10,
		4: 15
	},
	3: {
		1: 9,
		2: 10,
		4: 11,
		6: 2
	},
	4: {
		2: 15,
		3: 11,
		5: 6,
	},
	5: {
		4: 6,
		6: 9,
	},
	6: {
		1: 14,
		5: 9,
		3: 2
	}
}


class GraphPoint:
	def __init__(self, graph, number, routes):
		self.graph = graph
		self.number = number
		self.routes = routes
		self.visited = False
		self.minimum_range = 9999


	def get_unvisited_neighbours(self):
		neighbours = []
		for number in self.routes.keys():
			point = self.graph.get_point(number)
			if not point.visited:
				neighbours.append(point)
		return neighbours


	def get_range(self, point):
		return self.routes[point.number]


	def get_all_neighbours(self):
		neighbours = [self.graph.get_point(x) for x in self.routes.keys()]
		return neighbours



class Graph:
	def __init__(self, data):
		self.data = data
		self.points = {}

		for number, routes in data.items():
			self.points[number] = GraphPoint(self, number, routes)

		self.points[1].minimum_range = 0


	def get_point(self, number):
		point = self.points.get(number)

		if point is None:
			raise ValueError(f"Graph has no point with number {number}")

		return point



myGraph = Graph(graph)


start = myGraph.get_point(1)
queue = []
queue.append(start)


while len(queue) > 0:
	current_point = min(queue, key=lambda x: x.minimum_range)
	queue.remove(current_point)
	current_point.visited = True

	for neighbour in current_point.get_unvisited_neighbours():
		new_range = current_point.minimum_range + current_point.get_range(neighbour)

		if new_range < neighbour.minimum_range:
			neighbour.minimum_range = new_range

		queue.append(neighbour)



path = []
pos = myGraph.get_point(5)


while pos != start:
	for neighbour in pos.get_all_neighbours():
		if neighbour.get_range(pos) + neighbour.minimum_range == pos.minimum_range:
			path.append(pos)
			pos = neighbour
			break

path.append(start)

for i in path[::-1]:
	print(i.number)
# No comments here. Good l_ck!
