code: def top_sort_recursive(graph):
      
      order, enter, state = [], set(graph), {}
      
      def dfs(node):
          state[node] = GRAY
          #print(node)
          for k in graph.get(node, ()):
              sk = state.get(k, None)
              if sk == GRAY:
                  raise ValueError("cycle")
              if sk == BLACK:
                  continue
              enter.discard(k)
              dfs(k)
          order.append(node)
          state[node] = BLACK
          
      while enter: dfs(enter.pop())
      return order
docs: Time complexity is the same as DFS, which is O(V + E)
          Space complexity: O(V)