sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      module E :
        sig
          type t
          type label
          val label : Kruskal.G.E.t -> Kruskal.G.E.label
          val dst : Kruskal.G.E.t -> V.t
          val src : Kruskal.G.E.t -> V.t
        end
      val fold_vertex : (V.t -> '-> 'a) -> Kruskal.G.t -> '-> 'a
      val iter_edges_e : (Kruskal.G.E.t -> unit) -> Kruskal.G.t -> unit
    end
  module Make :
    functor (G : G->
      functor (W : sig type t = G.E.label val compare : t -> t -> int end->
        sig val spanningtree : Kruskal.G.t -> Kruskal.G.E.t list end
  module type UNIONFIND =
    sig
      type elt
      type t
      val init : Kruskal.UNIONFIND.elt list -> Kruskal.UNIONFIND.t
      val find :
        Kruskal.UNIONFIND.elt -> Kruskal.UNIONFIND.t -> Kruskal.UNIONFIND.elt
      val union :
        Kruskal.UNIONFIND.elt ->
        Kruskal.UNIONFIND.elt -> Kruskal.UNIONFIND.t -> unit
    end
  module Generic :
    functor (G : G->
      functor (W : sig type t = G.E.label val compare : t -> t -> int end->
        functor
          (UF : sig
                  type elt = G.V.t
                  type t
                  val init : elt list -> t
                  val find : elt -> t -> elt
                  val union : elt -> elt -> t -> unit
                end->
          sig val spanningtree : Kruskal.G.t -> Kruskal.G.E.t list end
end