let dijkstra (adj: '-> ('a * int) list) (v1:'a) (v2:'a) =
  let visited = Hashtbl.create 97 in
  let rec loop h =
    if is_empty h then raise Not_found;
    let (w,(v,p)),h = extract_min h in
      if v = v2 then 
        List.rev p, w
      else
        let h =
            if not (Hashtbl.mem visited v) then begin
              Hashtbl.add visited v ();
              List.fold_left (fun h (e,d) -> add (w+d, (e, e::p)) h) h (adj v)
            end else
              h
        in
          loop h
  in
    loop (add (0,(v1,[])) (empty()))