#include <bits/stdc++.h>

using namespace std;

const int OO = 1e9;
const double EPS = 1e-9;

#define ndl cout << '\n'
#define sz(v) int(v.size())
#define pb push_back
#define mp make_pair
#define fs first
#define sc second
#define present(a, x) (a.find(x) != a.end())
#ifdef LOCAL
#define db(...) ({cout << "> Line " << __LINE__  \
		<< ": "; _db(#__VA_ARGS__, __VA_ARGS__);})
#else
#define db(...) true
#endif
template<class T>
void _db(const char *dbStr, T e) {
	cout << dbStr << " = " << e << endl;
}
template<class T, class... L>
void _db(const char *dbStr, T e, L... r) {
  while(*dbStr != ',') cout << *dbStr++;
  cout << " = " << e << ','; _db(dbStr + 1, r...);
}
template<class S, class T>
ostream& operator<<(ostream& o, const map<S, T>& v) {
	o << "["; int i = 0;
	for (const pair<S, T>& pr : v) o << (!i++ ? "" : ", ") << "{"
	<< pr.fs << " : " << pr.sc << "}"; return o << "]";
}
template<template <class, class...> class S, class T, class... L>
ostream& operator<<(ostream& o, const S<T, L...>& v) {
	o << "["; int i = 0;
	for (const auto& e : v) o << (!i++ ? "" : ", ") << e;
	return o << "]";
}
template<class S, class T>
ostream& operator<<(ostream& o, const pair<S, T>& pr) {
	return o << "(" << pr.fs << ", " << pr.sc << ")";
}
ostream& operator<<(ostream& o, const string& s) {
	for (const char& c : s) o << c; return o;
}

template<class T> using V = vector<T>;
template<class T> using VV = V<V<T>>;
template<class T> using VVV = VV<V<T>>;
using ll = long long;
using pii = pair<int, int>;
using vi = V<int>;
using vii = V<pii>;
using vvi = VV<int>;
using mii = map<int, int>;
using umii = unordered_map<int, int>;
using si = set<int>;
using usi = unordered_set<int>;

const int MX = 2505;
int n, m, p, dist[MX], good[MX];
bool vis[MX];
VV<pii> adj(MX);
vvi adjR(MX), adjF(MX);

void dfs(int node) {
	good[node]++;
	vis[node] = true;
	for (auto& child : adjR[node])
		if (!vis[child])
			dfs(child);
}
void dfs2(int node) {
	good[node]++;
	vis[node] = true;
	for (auto& child : adjF[node])
		if (!vis[child])
			dfs2(child);
}


int main() {
	#ifdef LOCAL
	auto stTime = clock();
	#endif
	ios::sync_with_stdio(false);
	cout.precision(10);
	cin.tie(0);

	cin >> n >> m >> p;
//	++n;
	int u, v, w;
	for (int i = 0; i < m; ++i) {
		cin >> u >> v >> w;
		adj[u].pb(mp(v, -(w - p)));
		adjF[u].pb(v);
		adjR[v].pb(u);
	}
	dfs(n);
//	for (int i = 1; i <= n; ++i) {
//		cout << vis[i] << ' ';
//	}ndl;
	for (int i = 1; i <= n; ++i)
		vis[i] = 0;
	dfs2(1);
//	for (int i = 1; i <= n; ++i) {
//		cout << vis[i] << ' ';
//	}ndl;
	for (int i = 1; i <= n; ++i)
		if (good[i] != 2)
			good[i] = 0;
	for (int i = 1; i <= n; ++i)
		dist[i] = OO;
	dist[1] = 0;
	for (int i = 0; i < n - 1; ++i)
		for (int j = 0; j < sz(adj); ++j)
			for (int k = 0; k < sz(adj[j]); ++k) {
				u = j, v = adj[j][k].fs, w = adj[j][k].sc;
				if (good[u] && good[v])
					dist[v] = min(dist[v], dist[u] + w);
			}
//	for (int i = 1; i <= n; ++i) {
//		cout << dist[i] << ' ';
//	}ndl;
//	for (int i = 1; i <= n; ++i) {
//		cout << good[i] << ' ';
//	}ndl;
	bool negativeCycle = false;
	for (int i = 0; i < sz(adj); ++i) {
		for (int j = 0; j < sz(adj[i]); ++j) {
			u = i, v = adj[i][j].fs, w = adj[i][j].sc;
			if (good[u] && good[v] && dist[u] + w < dist[v]) {
				negativeCycle = true;
				break;
			}
		}
		if (negativeCycle)
			break;
	}
//	for (int i = 1; i <= n; ++i) {
//		cout << dist[i] << ' ';
//	}ndl;
	if (negativeCycle)
		cout << "-1\n";
	else
		cout << max(-dist[n], 0) << '\n';


	#ifdef LOCAL
	cout << "\n\n\nExecution time: " <<
		(clock() - stTime) * 1e3 / CLOCKS_PER_SEC << " ms\n";
	#endif
    return 0;
}


Measured memory_bytes: 788