module WeightedDirectedGraph
  (Vertex : sig
    type t
    val compare : t -> t -> int
  end)
  (Weight : sig
    type t
    val zero : t
    val ( + ) : t -> t -> t
    val compare : t -> t -> int
  end) :
sig
  val dijkstra :
    (* 隣接リスト *)
    (Vertex.t -> (Vertex.t * Weight.t) list) ->
    (* 始点 *)
    Vertex.t ->
    (* 始点から辿り着けなければNoneを返す *)
    (Vertex.t -> Weight.t option)
end =
struct
  module WMap = Map.Make (Weight)
  module VMap = Map.Make (Vertex)

  let dijkstra e s =
    (* 始点sからの距離 *)
    (* d に入っていない頂点への距離は無限大とみなす *)
    let d = ref @@ VMap.singleton s Weight.zero in
    (* 優先度付きキュー *)
    let q = ref @@ WMap.singleton Weight.zero [s] in
    (* ダイクストラ法のメインループ *)
    let rec dijkstra_aux t =
      match VMap.find_opt t !d, WMap.min_binding_opt !q with
      (* もう既に全ての頂点までの距離が分かっている *)
      | ans, None -> ans
      (* 既に終点までの距離が分かっているので返す *)
      | Some x as ans, Some (w, _) when Weight.compare x w <= 0 -> ans
      (* 終点までの距離が分かっていないので，ダイクストラ法を続行 *)
      | _, Some (w, us) ->
          q := WMap.remove w !q;
          Fun.flip List.iter us (fun u ->
            if 0 <= Weight.compare (VMap.find u !d) w then
              (* 未だ頂点uを訪れていない *)
              Fun.flip List.iter (e u) (fun (v, c) ->
                let open Weight in
                match VMap.find_opt v !d with
                | Some d when Weight.compare d (w + c) <= 0 -> ()
                | _ ->
                    d := VMap.add v (w + c) !d;
                    q := WMap.add (w + c) (v :: try WMap.find (w + c) !q with Not_found -> []) !q));
          dijkstra_aux t in dijkstra_aux
end

module G = WeightedDirectedGraph
  (struct
    type t = int * int
    let compare = compare
  end)
  (struct
    type t = int
    let zero = 0
    let ( + ) = ( + )
    let compare = compare
  end)

let () = Scanf.scanf "%d %d %d\n" @@ fun n m s ->
  let es = Array.make_matrix n 3001 [] in
  for i = 0 to m - 1 do
    Scanf.scanf "%d %d %d %d\n" @@ fun u v a b ->
      for i = a to 3000 do
        es.(u - 1).(i) <- ((v - 1, i - a), b) :: es.(u - 1).(i);
        es.(v - 1).(i) <- ((u - 1, i - a), b) :: es.(v - 1).(i);
      done
  done;
  for v = 0 to n - 1 do
    Scanf.scanf "%d %d\n" @@ fun c d ->
      for j = 0 to 3000 do
        es.(v).(j) <- ((v, min 3000 (j + c)), d) :: es.(v).(j)
      done
  done;
  let d = Fun.flip G.dijkstra (0, min 3000 s) @@ fun (v, c) -> es.(v).(c) in
  for v = 1 to n - 1 do
    Printf.printf "%d\n" @@
    List.fold_left min max_int @@
    List.init 3001 @@ fun i ->
      Option.value ~default:max_int @@ d (v, i)
  done

