#include <queue>
#include <iostream>
#include <iomanip>
#include <math.h>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
#define F(i, a, b) for(register int i = a, i##end = b; i <= i##end; i++)
#define UF(i, a, b) for(register int i = a, i##end = b; i >= i##end; i--)
using namespace std;
inline int read()
{
int x = 0;
bool fu = 0;
char ch = 0;
while(ch > '9' || ch < '0')
{
ch = getchar();
if(ch == '-')
fu = 1;
}
while(ch <= '9' && ch >= '0')
x = (x * 10 - 48 + ch), ch = getchar();
return fu ? -x : x;
}
struct Edge
{
int to, next, val;
}edges[10005];
int epos;
int head[10005];
bool in[5005];
void add(int u, int v, int val)
{
edges[++epos].to = v;
edges[epos].next = head[u];
edges[epos].val = val;
head[u] = epos;
}
int n;
int nu, nv, nval, val, st;
int r;
int dfs(int u, int f, int d)
{
if(d > val)
{
val = d;
st = u;
}
int myr = -1;
for(int i = head[u]; i; i = edges[i].next)
{
int v = edges[i].to;
int toval = edges[i].val;
if(v != f && (u != nu || v != nv) && (u != nv || v != nu))
{
myr = max(myr, dfs(v, u, d + toval) + toval);
}
}
r = min(r, max(myr, d));
return myr;
}
int mission()
{
val = -1;
r = 0x3f3f3f3f;
dfs(nu, 0, 0);
val = -1;
r = 0x3f3f3f3f;
dfs(st, 0, 0);
int dis1 = val;
int mid1 = r;
val = -1;
r = 0x3f3f3f3f;
dfs(nv, 0, 0);
val = -1;
r = 0x3f3f3f3f;
dfs(st, 0, 0);
int dis2 = val;
int mid2 = r;
return max(max(dis1, dis2), mid1 + nval + mid2);
}
signed main()
{
n = read();
int ans = 0x3f3f3f3f;
F(i, 1, n - 1)
{
int u = read(), v = read(), val = read();
add(u, v, val);
add(v, u, val);
}
F(i, 1, n)
{
for(int j = head[i]; j; j = edges[j].next)
{
nu = i, nv = edges[j].to, nval = edges[j].val;
if(!in[nv])
ans = min(ans, mission());
}
in[i] = true;
}
printf("%d", ans);
return 0;
}