#include "dreaming.h"
#include<bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int> > > adj;
vector<bool> visited;
vector<long long> res;
long long dfs(int u, int p){
long long ans = 0;
for(pair<int, int> x : adj[u]){
int v = x.first;
if(v != p){
ans = max(ans, dfs(v, u) + x.second);
}
}
return ans;
}
long long dfs2(int u, int p){
visited[u] = true;
long long ans = res[u];
for(pair<int, int> x : adj[u]){
int v = x.first;
if(v != p){
ans = min(ans, dfs2(v, u));
}
}
return ans;
}
int travelTime(int N, int M, int L, int A[], int B[], int T[]){
adj.resize(N);
visited.resize(N);
res.resize(N);
for(int i = 0; i < M; i++){
adj[A[i]].push_back(make_pair(B[i], T[i]));
adj[B[i]].push_back(make_pair(A[i], T[i]));
}
long long mxDiameter = 0;
for(int i = 0; i < N; i++){
res[i] = dfs(i, -1);
mxDiameter = max(mxDiameter, res[i]);
}
vector<long long> thing;
for(int i = 0; i < N; i++){
if(!visited[i]){
thing.push_back(dfs2(i, -1));
}
}
sort(thing.begin(), thing.end());
reverse(thing.begin(), thing.end());
if((int)thing.size() > 1){
long long stuff1 = thing[0] + thing[1] + L;
if((int)thing.size() == 2){
return max(stuff1, mxDiameter);
}
else{
return max(max(stuff1, thing[1] + thing[2] + 2 * L), mxDiameter);
}
}
else{
return thing[0];
}
}
// int main(){
// int n, m, l;
// cin >> n >> m >> l;
// int a[m];
// int b[m];
// int t[m];
// for(int i = 0; i < m; i++){
// cin >> a[i] >> b[i] >> t[i];
// }
// cout << travelTime(n, m, l, a, b, t) << "\n";
// }