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) (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) (W : sig type t = G.E.label val compare : t -> t -> int end) (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