module WeightedDirectedGraph
  (Weight : sig
    type t
    val inf : t (* オーバーフローの恐れはないので，max_intとか突っ込んでも良い *)
    val zero : t
    val neg_inf : t (* オーバーフローの恐れはないので，min_intとか突っ込んでも良い *)
    val ( + ) : t -> t -> t
    val compare : t -> t -> int
  end) :
sig
  type 'a church_list = { fold : 'b. ('a -> 'b -> 'b) -> 'b -> 'b }

  val bellman_ford :
    (* 頂点数n *)
    int ->
    (* 辺のリスト
       頂点は0からn-1までの整数でなくてはならない *)
    (int * int * Weight.t) church_list ->
    (* 始点 *)
    int ->
    (* 頂点を受け取り，そこまでの距離を返す関数
       頂点に到達するパスが無ければinfを返し，
       そこに到達するまでに負閉路があればneg_infを返す *)
    (int -> Weight.t)
end =
struct
  type 'a church_list = { fold : 'b. ('a -> 'b -> 'b) -> 'b -> 'b }

  let bellman_ford n es s =
    (* 距離を覚えるやつ *)
    let d = Array.make n Weight.inf in
    (* 始点より終点のインデックスが大きくなる辺を集めた隣接リスト *)
    let inc = Array.make n [] in
    (* 始点より終点のインデックスが小さくなる辺を集めた隣接リスト *)
    let dec = Array.make n [] in
    es.fold (fun ((u, v, _) as e) () ->
      if u <= v
      then inc.(u) <- e :: inc.(u)
      else dec.(u) <- e :: dec.(u)) ();
    d.(s) <- Weight.zero;
    (* n / 2 回目以降の各辺の処理 *)
    let f is_modified (u, v, c) =
      (* 原点から到達できない頂点は更新しない *)
      if 0 <= Weight.compare d.(u) Weight.inf
      then is_modified
      else
        let dv =
          if 0 <= Weight.compare Weight.neg_inf d.(u)
          then Weight.neg_inf
          else let open Weight in d.(u) + c in
        if 0 <= Weight.compare dv d.(v)
        then is_modified
        else (d.(v) <- Weight.neg_inf; true) in
    (* n / 2 回以降の反復 *)
    let rec iter' = function
      | 0 -> ()
      | i ->
          if
            Array.fold_right (Fun.flip (List.fold_left f)) dec @@
            Array.fold_left (List.fold_left f) false inc
          then iter' (i - 1) in
    (* n / 2 回目以前の各辺の処理 *)
    let f is_modified (u, v, c) =
      (* 原点から到達できない頂点は更新しない *)
      if 0 <= Weight.compare d.(u) Weight.inf
      then is_modified
      else
        let dv = let open Weight in d.(u) + c in
        if 0 <= Weight.compare dv d.(v)
        then is_modified
        else (d.(v) <- dv; true) in
    let rec iter = function
      | 0 -> iter' (succ n lsr 1)
      | i ->
          if
            Array.fold_right (Fun.flip (List.fold_left f)) dec @@
            Array.fold_left (List.fold_left f) false inc
          then iter (i - 1) in
    iter (n lsr 1);
    Array.get d
end

module G = WeightedDirectedGraph (struct
  type t = int
  let zero = 0
  let inf = min_int
  let neg_inf = max_int
  let ( + ) = ( + )
  let compare x y = compare y x
end)

let () = Scanf.scanf "%d %d %d\n" @@ fun n m p ->
  let abc = Array.init m @@ fun _ ->
    Scanf.scanf "%d %d %d\n" @@ fun a b c -> a - 1, b - 1, c - p in
  let d = G.bellman_ford n { G.fold = fun f -> Array.fold_right f abc } 0 (n - 1) in
  if max_int <= d
  then print_endline "-1"
  else Printf.printf "%d\n" @@ max 0 d
