module WeightedDirectedGraph
: sig
  (* 配列を用いたダイクストラ法の実装
     単純な速さでは一番だが，インターフェースが不便 *)
  module ByArray : sig
    module Make :
      functor (Weight : sig
        type t
        val inf : t
        val zero : t
        val ( + ) : t -> t -> t
        val compare : t -> t -> int
      end) ->
      sig
        (* 頂点を[0, n)の自然数に限定したグラフに対してのダイクストラ法
           時間計算量O(V^2)なので，密なグラフなら速い *)
        val dijkstra_dense : 
        (* 頂点数n *)
        int ->
        (* 隣接リスト *)
        (int -> (int * Weight.t) list) ->
        (* 始点 *)
        int ->
        (* 始点から辿り着けなければinfを返す関数
           この関数を覚えておけば，呼び出しごとの途中までの計算結果がシェアされる *)
        (int -> Weight.t)
      end
  end
end
= struct
  module type Weight = sig
    type t
    val zero : t
    val ( + ) : t -> t -> t
    val compare : t -> t -> int
  end

  module ByArray = struct
    module Make (W : sig include Weight val inf : t end) = struct
      let dijkstra_dense n e s =
        let d = Array.make n W.inf in
        d.(s) <- W.zero;
        let rec dijkstra_dense_aux = function
          | [] -> ()
          | v :: vs ->
              let u, us = List.fold_left (fun (u, us) v ->
                if W.compare d.(u) d.(v) < 0
                then (u, v :: us)
                else (v, u :: us)) (v, []) vs in
              List.iter (fun (v, c) ->
                let open W in
                if 0 < W.compare d.(v) (d.(u) + c) then
                  d.(v) <- d.(u) + c) (e u);
              dijkstra_dense_aux us in
        dijkstra_dense_aux (Array.to_list @@ Array.init n @@ fun v -> v);
        Array.get d
      end
  end
end

module G = WeightedDirectedGraph.ByArray.Make (struct
  type t = float
  let inf = infinity
  let zero = 0.
  let ( + ) = ( +. )
  let compare = compare
end)

let () = Scanf.scanf "%d %d %d %d\n%d\n" @@ fun xs ys xt yt n ->
  let xyrs = Array.init (n + 2) @@ function
    | 0 -> (float_of_int xs, float_of_int ys, 0.)
    | 1 -> (float_of_int xt, float_of_int yt, 0.)
    | _ -> Scanf.scanf "%d %d %d\n" @@ fun x y r ->
        float_of_int x, float_of_int y, float_of_int r in
  Printf.printf "%.16f" @@
  G.dijkstra_dense (n + 2) (fun v ->
      let (x, y, r) = xyrs.(v) in
      List.mapi (fun u (x', y', r') ->
        (u, max 0. (sqrt ((x -. x') ** 2. +. (y -. y') ** 2.) -. r -. r'))) @@
      Array.to_list xyrs) 0 1


  
