topological sorting with DFS O(n)
for each node:
if not marked:
if(dfs(node)==CYCLE) return CYCLE
return OK
dfs(node):
if node is marked as visited: return OK
if node is marked as visiting: return CYCLE
mark node as visiting
for each new_node in node.neighbors:
if dfs(new_node) == CYCPE return CYCLE
mark node as visited
#add node to head of ordered_listed
return OK