#include<bits/stdc++.h>
using namespace std;
#define M 5005
int n,mxlen,trp,pl,pr,value,ans=2e9,pre[M],d[M],dl[M],dr[M],dn[M];
vector <int> w[M];
vector <int> v[M];
bool c[M][M];
void dfs(int x,int fa,int cnt,int jl)
{
if(cnt==2&&jl==1) pre[x]=fa;
for(int i=0;i<w[x].size();i++){
int y=w[x][i],k=v[x][i];
if(y==fa||c[x][y]) continue;
d[y]=d[x]+k;
if(cnt==2) dl[y]=d[y];
if(cnt==3){
dr[y]=d[y];
dn[y]=max(dl[y],dr[y]);
if(mxlen>dn[y]) mxlen=dn[y];
}
if(mxlen<d[y]&&cnt!=3) mxlen=d[y],trp=y;
dfs(y,x,cnt,jl);
}
}
void get(int x,int jl)
{
trp=x;
for(int i=1;i<=2;i++){
mxlen=0;
memset(d,0,sizeof d);
dfs(trp,0,i,jl);
if(i==1) pl=trp;
else pr=trp;
}
}
int getzx(int x)
{
get(x,0);
int zj=mxlen,mxlen=2e9;
memset(d,0,sizeof d);
dfs(pr,0,3,0);
return zj;
}
int main(){
cin>>n;
for(int i=1;i<n;i++){
int x,y,z; cin>>x>>y>>z;
w[x].push_back(y); w[y].push_back(x);
v[x].push_back(z); v[y].push_back(z);
}
get(1,1);
for(int i=pr;i;i=pre[i]){
int x=i,y=pre[x];
if(!x||!y) continue;
c[x][y]=c[y][x]=true;
for(int j=0;j<w[x].size();j++){
if(w[x][j]==y){
value=v[x][j];
break;
}
}
int zj1=getzx(x),t1=mxlen;
int zj2=getzx(y),t2=mxlen;
int res=max(max(zj1,zj2),t1+t2+value);
ans=min(ans,res);
c[x][y]=c[y][x]=false;
}
cout<<ans;
return 0;
}