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)
      if len(ordered) != len(graph) - 1:
          raise ValueError('Graph has a cycle')
      return ordered