sig
  module type G =
    sig
      type t
      module V : Sig.COMPARABLE
      module E :
        sig
          type t
          type label
          val label : Prim.G.E.t -> Prim.G.E.label
          val dst : Prim.G.E.t -> V.t
          val src : Prim.G.E.t -> V.t
          val compare : Prim.G.E.t -> Prim.G.E.t -> int
        end
      val iter_vertex : (V.t -> unit) -> Prim.G.t -> unit
      val iter_edges_e : (Prim.G.E.t -> unit) -> Prim.G.t -> unit
      val iter_succ_e : (Prim.G.E.t -> unit) -> Prim.G.t -> V.t -> unit
    end
  module Make :
    functor
      (G : G) (W : sig
                     type edge = G.E.t
                     type t
                     val weight : edge -> t
                     val compare : t -> t -> int
                     val add : t -> t -> t
                     val zero : t
                   end->
      sig
        val spanningtree : Prim.G.t -> Prim.G.E.t list
        val spanningtree_from : Prim.G.t -> G.V.t -> Prim.G.E.t list
      end
end