#include <bits/stdc++.h>
using namespace std ;
#define endl '\n'
#define pb push_back
#define REP(i , n) for(int i = 0 , _n = (n) ; i < _n ; ++i)
#define MAXN 100005
vector <pair <int , int>> adj[MAXN + 1] ;
int numNode , numEdge , f[MAXN + 1] , g[MAXN + 1] ;
bool vis[MAXN + 1] ;
void dfs(int u , int par) {
vis[u] = true ;
for(pair <int , int> it : adj[u]) {
int v = it.first , w = it.second ;
if(v == par) continue ;
dfs(v , u) ;
f[u] = max(f[u] , f[v] + w) ;
}
}
int minOfMaxDist , res = 0 ;
void down(int u , int par) {
res = max(res , max( f[u] , g[u] )) ;
minOfMaxDist = min(minOfMaxDist , max( g[u] , f[u] )) ;
int sz = (int) adj[u].size() ;
if(sz == 0) return ;
vector <int> pre(sz + 1) , suff(sz + 2) ;
if(adj[u][0].first != par) pre[0] = f[ adj[u][0].first ] + adj[u][0].second ;
if(adj[u][sz - 1].first != par) suff[sz - 1] = f[ adj[u][sz - 1].first ] + adj[u][sz - 1].second ;
for(int i = 1 ; i < sz ; ++i) pre[i] = (adj[u][i].first == par ? pre[i - 1] : max(pre[i - 1] , f[ adj[u][i].first ] + adj[u][i].second ) ) ;
for(int i = sz - 1 ; i >= 0 ; --i) suff[i] = (adj[u][i].first == par ? suff[i + 1] : max( suff[i + 1] , f[ adj[u][i].first ] + adj[u][i].second )) ;
REP(i , sz) {
int v = adj[u][i].first , w = adj[u][i].second ;
if(v == par) continue ;
g[v] = g[u] + w ;
int cost = 0 ;
if(i == 0) cost = suff[i + 1] ;
else if(i == sz - 1) {
if(i == 0) cost = 0 ;
else cost = pre[i - 1] ;
}
else cost = max(pre[i - 1] , suff[i + 1]) ;
g[v] = max(g[v] , cost + w) ;
down(v , u) ;
}
}
int main(void) {
ios_base::sync_with_stdio(false) ;
cout.tie(nullptr) ;
cin.tie(nullptr) ;
int l ;
cin >> numNode >> numEdge >> l ;
REP(faker , numEdge) {
int u , v , w ; cin >> u >> v >> w ;
adj[u].pb({v , w}) ; adj[v].pb({u , w}) ;
}
vector <int> tmp ;
for(int i = 0 ; i < numNode ; ++i) if(vis[i] == false) {
minOfMaxDist = (int) 1e9 + 36 ;
dfs(i , -1) ;
down(i , -1) ;
tmp.pb(minOfMaxDist) ;
}
sort(tmp.begin() , tmp.end() , greater <int> ()) ;
if((int) tmp.size() == 1) cout << res << endl ;
else if((int) tmp.size() == 2) cout << max(res , tmp[0] + tmp[1] + l) << endl ;
else cout << max(res , max( tmp[0] + tmp[1] + l , tmp[1] + tmp[2] + 2 * l ) ) ;
return 0 ;
}