sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      val iter_vertex : (V.t -> unit) -> Components.G.t -> unit
      val iter_succ : (V.t -> unit) -> Components.G.t -> V.t -> unit
    end
  module Make :
    functor (G : G->
      sig
        val scc : Components.G.t -> int * (G.V.t -> int)
        val scc_array : Components.G.t -> G.V.t list array
        val scc_list : Components.G.t -> G.V.t list list
      end
  module type U =
    sig
      type t
      module V : Sig.COMPARABLE
      val iter_vertex : (V.t -> unit) -> Components.U.t -> unit
      val iter_edges : (V.t -> V.t -> unit) -> Components.U.t -> unit
    end
  module Undirected :
    functor (G : U->
      sig
        val components : Components.G.t -> int * (G.V.t -> int)
        val components_array : Components.G.t -> G.V.t list array
        val components_list : Components.G.t -> G.V.t list list
      end
end