#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for(ll i=0; i<n; i++)
typedef long long ll;
typedef long long unsigned int llu;
ll MOD = 1000000007;
ll INF = 1000000009;

/*
*/

struct edge{
    int p;
    int c;
    int w;
};

void solve(){
    int n,m,p;
    cin >> n >> m >> p;
    vector<edge> v;
    vector<pair<int,int>> g[n+10];
    rep(i,m){
        int a,b,c;
        cin >> a >> b >> c;
        v.emplace_back(edge{a,b,p-c});
        g[a].emplace_back(make_pair(b,p-c));
    }
    int cost[n+10];
    fill(cost,cost+n+10,INF);
    cost[1]=0;
    rep(i,n){
        for(int j=1; j<=n ;j++){
            for(auto e:g[j]){
                if(cost[e.first]==INF&&cost[j]==INF) cost[e.first] = INF;
                else cost[e.first] = min(cost[e.first], cost[j]+e.second);
            }  
        }
        //rep(j,n) cout << "cost[" << j+1 << "]:" <<  cost[j+1] << endl;
    }
    int tmp = cost[n];

    bool negative[n+10];
    fill(negative,negative+n+10,false);
    rep(i,n){
        for(int j=1; j<=n ;j++){
            for(auto e:g[j]){
                int tmp=cost[e.first];
                if(cost[e.first]==INF&&cost[j]==INF) cost[e.first] = INF;
                else cost[e.first] = min(cost[e.first], cost[j]+e.second);
                if(tmp!=cost[e.first]) negative[e.first] = true;
                if(negative[j]==true) negative[e.first] = true;
            }  
        }
        //rep(j,n) cout << "cost[" << j+1 << "]:" <<  cost[j+1] << endl;
    }
    

    
    if(negative[n]) {
        cout << -1 << endl;
        return;
    }
    cout << max(-cost[n],0) << endl;


}

/*
void solve(){

    int n,m,p;
    cin >> n >> m >> p;
    vector<edge> v;
    rep(i,m){
        int a,b,c;
        cin >> a >> b >> c;
        v.emplace_back(edge{a,b,c-p});
    }
    //頂点のうち、1,nを除いて右辺または左辺にしか存在しないものを削除.
    bool l[n+10];
    fill(l,l+n+9,false);
    bool r[n+10];
    fill(r,r+n+9,false);
    l[1]=true;
    r[1]=true;
    l[n]=true;
    r[n]=true;
    for(auto edge:v){
        l[edge.p]=true;
        r[edge.c]=true;
    }
    bool lr[n+10];
    fill(lr,lr+n+9,false);
    rep(i,n){
        lr[i+1]=l[i+1]&&r[i+1];
    }
    vector<edge> vec;
    rep(i,m){
        if(lr[v[i].p]&&lr[v[i].c]) vec.emplace_back(v[i]);
    }

    //閉路がある場合、最大値は無限になる
    //DAGかどうかを調べるアルゴリズム. 訪問済み頂点を管理し、DFSで訪問済みの頂点を掘り当てたら終了
    for(auto i:vec){
        cout << i.p << " " << i.c << " " << i.w << endl;
    }

    bool bl[n+10];
    fill(bl,bl+n+9,false);
    stack<int> st;
    st.push(1);
    bool isnotDAG=false;
    while(!st.empty()){
        int tmp = st.top();
        if(bl[tmp]) {
            isnotDAG=true;
            break;
        }
        else bl[tmp] = true;
        st.pop();
        for(auto edge:vec){
            if(edge.p==tmp){
                st.push(edge.c);
            }
        }
    }
    if(isnotDAG) {
        cout << -1 << endl;
        return;
    }

    set<int> s;
    for(auto i:vec){
        s.insert(i.p);
        s.insert(i.c);
    }
    int siz = s.size();
    vector<edge> ve;
    int f[n+10];
    auto it = s.begin();
    int point = 1;
    rep(i,siz){
        f[*it]=point;
        it++;
        point++;
    }
    for(auto i :vec){
        ve.emplace_back(edge{f[i.p], f[i.c], -i.w});
    }
    n = ve.size();

    vector<pair<int,int>> g[n+10];
    vector<int> h[n+10];
    for(auto i:ve){
        g[i.p].emplace_back(make_pair(i.c,i.w));
    }

    int cost[n+10];
    fill(cost,cost+n+9,INF);
    rep(k,n){
    for(int i=1; i<=n; i++){
        for(auto j:g[i]){
            cost[j.first]=min(cost[j.first],cost[i]+j.second);
        }
    }
    }

    cout << cost[n] << endl;
    return;

}
*/

int main(){
  cin.tie(0);
  ios::sync_with_stdio(false);
  solve();
  return 0;
}

Measured memory_bytes: 512