//#pragma GCC target("avx2")
//#pragma GCC optimize("O3")
   
//#include <x86intrin.h>
#include <bits/stdc++.h>   
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
 
using namespace __gnu_pbds;
using namespace std;

template<typename T> using ordered_set = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
     
#define F first
#define S second           
#define lb lower_bound               
#define ub upper_bound
#define pb push_back
#define pf push_front    
#define ppb pop_back
#define mp make_pair                                     
#define bpp __builtin_popcountll                                                                                        
#define sqr(x) ((x) * (x)) 
#define al 0x3F3F3F3F
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define in insert
#define ppf pop_front
#define endl '\n'
//#define int long long
 
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
typedef pair <int, int> pii;
 
const int mod = (int)1e9 + 7;
const int N = (int)3e5 + 123;
const ll inf = (ll)1e18 + 1;

const double pi = acos (-1.0);
const double eps = 1e-7;                  
const int dx[] = {0, 0, 1, 0, -1};
const int dy[] = {0, 1, 0, -1, 0};

int n, m, p, a[N], b[N], c[N], used[N];
pii pr[N];
ll d[N];
int T[2555][2555];
bool is[N];
vector <pii> g[N];
vector <int> order;

void dfs (int v) {
   used[v] = 1;
   for (auto it : g[v]) {
      if (!used[it.F])
         dfs (it.F);
   }
   used[v] = 2;
}

inline void boost () {                    
   ios_base :: sync_with_stdio (NULL);
   cin.tie (NULL), cout.tie (NULL);          
}                                                     

inline void Solve () {
   cin >> n >> m >> p;
   for (int i = 1; i <= m; i ++) {
      cin >> a[i] >> b[i] >> c[i];
      c[i] = p - c[i];
      if (T[a[i]][b[i]]) {
         if (c[g[a[i]][T[a[i]][b[i]] - 1].S] > c[i]) {
            g[a[i]][T[a[i]][b[i]] - 1].S = i;            
         }
         continue;
      }
      g[a[i]].pb ({b[i], i});
      T[a[i]][b[i]] = sz (g[a[i]]);
   }
   for (int i = 2; i <= n; i ++) d[i] = inf;
   for (int i = 1; i <= n; i ++) {
      for (int j = 1; j <= m; j ++) {
         if (d[a[j]] < inf) {
            if (d[b[j]] > d[a[j]] + c[j]) {
               d[b[j]] = d[a[j]] + c[j];
            }
         }
      }
   }
   for (int i = 1; i <= n; i ++) {
      for (int j = 1; j <= m; j ++) {
         if (d[a[j]] < inf) {
            if (d[b[j]] > d[a[j]] + c[j]) {
               if (!used[a[j]])
                  dfs (a[j]);
            }
         }
      }
   }
   ll ans = d[n];                   /*
   for (int i = 1; i <= n; i ++) {
      for (int j = 1; j <= m; j ++) {
         if (d[a[j]] < inf) {
            if (d[b[j]] > d[a[j]] + c[j]) {
               d[b[j]] = d[a[j]] + c[j];
            }
         }
      }
   }                                 */
   if (used[n] || d[n] == inf) cout << -1, exit (0);
   cout << max (0ll, -d[n]);
}

main () {                                       
// freopen (".in", "r", stdin);    
// freopen (".out", "w", stdout);              
   boost ();
   int tt = 1;
   //cin >> tt;   
   while (tt --) {
      Solve ();
   }                                               
   return 0;      
}
                          

Measured memory_bytes: 39424