def cloneGraph(self, node: 'Node') -> 'Node':
self.oldToNew: Dict['Node', 'Node'] = {}
if node is None: return None
if node in self.oldToNew: return self.oldToNew[node]
new_node = Node(node.val)
# store in hash before recursion as graph might circle back to this node
self.oldToNew[node] = new_node
new_node.neighbors = [self.cloneGraph(n) for n in node.neighbors]
return new_node