def topsort(graph):
todos = set(graph.keys())
seen = set()
result = []
while todos:
for key in todos:
deps = graph[key]
if len([d for d in deps if d in seen]) == len(deps):
break
else:
raise Exception('Cycle: {}'.format(todos))
todos.remove(key)
result.append(key)
seen.add(key)
return result