code: def toposort(graph, pick_first='head'):
      
      in_deg = {}
      for node, next_nodes in six.iteritems(graph):
          for next_node in [next_nodes.head_node, next_nodes.update_node]:
              if next_node is None:
                  continue
              in_deg[next_node] = in_deg.get(next_node, 0) + 1
  
      stk = [FIRST]
      ordered = []
      visited = set()
      while stk:
          node = stk.pop()
          visited.add(node)
          if node != FIRST:
              ordered.append(node)
          traversal = _get_traversal(graph.get(node, BeforeNodes()), pick_first)
          for next_node in traversal:
              if next_node is None:
                  continue
              if next_node in visited:
                  raise ValueError('Graph has a cycle')
  
              in_deg[next_node] -= 1
              if in_deg[next_node] == 0:
                  stk.append(next_node)
  
      # Nodes may not be walked because they don't reach in degree 0.
      if len(ordered) != len(graph) - 1:
          raise ValueError('Graph has a cycle')
      return ordered
docs: Toplogically sorts a list match graph.
  
      Tries to perform a topological sort using as tiebreaker the pick_first
      argument. If the graph contains cycles, raise ValueError.