#include <algorithm>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
#define int long long
#define endl '\n'
using namespace std;
const int N = 10010;
const int M = N * 2;
const int INF = 0x3f3f3f3f3f3f3f3f;
int h[N], e[M], ne[M], w[M], idx;
int n, ans;
int d1[N], d2[N], up[N], s[N];
void add(int a, int b, int c)
{
e[idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx++;
}
int dfs_d(int u, int fa)
{
d1[u] = 0, d2[u] = 0;
for (int i = h[u]; i != -1; i = ne[i])
{
int son = e[i];
if (son == fa)
{
continue;
}
int d = dfs_d(son, u) + w[i];
if (d >= d1[u])
{
d2[u] = d1[u];
d1[u] = d;
s[u] = son;
}
else if (d > d2[u])
{
d2[u] = d;
}
}
return d1[u];
}
void dfs_u(int u, int fa)
{
for (int i = h[u]; i != -1; i = ne[i])
{
int son = e[i];
if (son == fa)
{
continue;
}
// 一个点向上走的最长距离,要么是他爸向上走的最长距离和他爸向下走的最长距离取max(如果他不在这条路上);
// 要么是他爸向上走的最长距离和他爸向下走的第二长距离取max;
if (s[u] == son)
{
up[son] = max(up[u], d2[u]) + w[i];
}
else
{
up[son] = max(up[u], d1[u]) + w[i];
}
dfs_u(son, u);
}
}
signed main(void)
{
memset(h, -1, sizeof(h));
cin >> n;
for (int i = 1; i <= n - 1; i++)
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c);
add(b, a, c);
}
dfs_d(1, 0);
dfs_u(1, 0);
int ans = INF;
for (int i = 1; i <= n; i++)
{
ans = min(ans, max(d1[i], up[i]));
// 一个点能走的多远,等于它向上走的距离和向下走的距离取Max;
}
cout << ans << endl;
return 0;
}