#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p;
struct edge{
int v,w;
edge(int a,int b){
v = a,w = b;
}
};
vector<edge> e[2505],k[2505];
void build(int u,int v,int w){
e[u].emplace_back(edge(v,w));
k[v].emplace_back(edge(u,w));
return ;
}
int dis[2505],cnt[2505];
bool vis[2505],f[2505];
void dfs(int x){
f[x] = 1;
for(int i = 0;i<k[x].size();i++){
if(f[k[x][i].v]) continue;
dfs(f[k[x][i].v]);
}
return ;
}
bool spfa(int s){
memset(dis,0xcf,sizeof(dis));
memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
dis[s] = 0;
vis[s] = 1;
cnt[s] = 0;
queue<int> q;
q.push(s);
int frt;
while(!q.empty()){
frt = q.front();
q.pop();
vis[frt] = 0;
for(int i = 0;i<e[frt].size();i++){
if((dis[e[frt][i].v] < dis[frt]+e[frt][i].w)&&f[e[frt][i].v]){
dis[e[frt][i].v] = dis[frt]+e[frt][i].w;
if(!vis[e[frt][i].v]){
cnt[e[frt][i].v] = cnt[frt]+1;
vis[e[frt][i].v] = 1;
q.push(e[frt][i].v);
}
if(cnt[e[frt][i].v] >= n){
return 0;
}
}
}
}
return 1;
}
signed main(){
cin>>n>>m>>p;
int U,V,W;
for(int i = 1;i<=m;i++){
cin>>U>>V>>W;
build(U,V,W-p);
}
dfs(n);
if(spfa(1)){
if(dis[n] > 0){
cout<<dis[n];
}else{
cout<<0;
}
}else{
cout<<-1;
}
return 0;
}