#include <bits/stdc++.h>
#include "dreaming.h"
using namespace std;
///#define int long long
void f(){
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
}
int travelTime(int n, int m, int L, int A[], int B[], int T[]) {
vector<vector<array<int, 2>>> g(n);
for(int i=0; i<m; i++){
int x, y, z; x=A[i], y=B[i], z=T[i];
g[x].push_back({y, z});
g[y].push_back({x, z});
}
vector<int> vis(n), ma(n);
int ans=0, sum, mi;
vector<int> all;
auto dfs=[&](int v, int p, auto&&dfs)->void{
vis[v]=1;
vector<int> x;
for(auto [i, c]: g[v]){
if(i==p) continue;
dfs(i, v, dfs);
ma[v]=max(ma[v], ma[i]+c);
x.push_back(ma[i]+c);
}
sort(x.begin(), x.end(), [&](int a, int b){
return a>b;
});
if(x.size()==1){
if(sum<x[0]){
sum=x[0];
mi=x[0];
}
else if(sum==x[0]){
mi=min(mi,x[0]);
}
}
else if(x.size()>1){
if(sum<x[0]+x[1]){
sum=x[0]+x[1];
mi=x[0];
}
else if(sum==x[0]+x[1]){
mi=min(mi,x[0]);
}
}
};
auto dfs2=[&](int v, int p, auto&&dfs2)->void{
int maa=0, id=0;
int tmp=ma[v];
for(auto [i, c]: g[v]){
if(ma[i]+c>maa) maa=ma[i]+c, id=i;
}
int maa2=0, id2=0;
for(auto [i, c]: g[v]){
if(ma[i]+c>maa2&&i!=id) maa2=ma[i]+c, id2=i;
}
if(g[v].size()==1&&p!=v) return;
for(auto [i, c]: g[v]){
if(i!=p&&id!=i){
ma[v]=maa;
dfs2(i, v, dfs2);
ma[v]=tmp;
}
else if(i==id&&i!=p){
ma[v]=maa2;
dfs2(i, v, dfs2);
}
}
if(maa+maa2==sum){
mi=min(mi, maa);
}
ma[v]=tmp;
};
for(int i=0; i<n; i++){
if(vis[i]) continue;
mi=1e18, sum=0;
dfs(i, i, dfs);
dfs2(i, i, dfs2);
ans=max(ans, sum);
all.push_back(mi);
}
sort(all.begin(), all.end(), [&](int a, int b){
return a>b;
});
if(all.size()>1) ans=max(ans, all[0]+all[1]+L);
if(all.size()>2) ans=max(ans, all[1]+all[2]+2*L);
return ans;
}/*
signed main(){
f();
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m, L; cin >> n >> m >> L;
} */