#include <bits/stdc++.h>
class Edge
{
public:
int to;
int dis;
int next;
};
Edge edges[5050 * 2];
int heads[5050];
int dis[5050];
auto cnt = 0;
void add(int u, int v, int w)
{
edges[++cnt].to = v;
edges[cnt].next = heads[u];
edges[cnt].dis = w;
heads[u] = cnt;
}
int deleted;
void dfs_d(int now, int parent)
{
for (auto i = heads[now]; i; i = edges[i].next)
{
if (edges[i].to == deleted || edges[i].to == parent)
{
continue;
}
dis[edges[i].to] = dis[now] + edges[i].dis;
dfs_d(edges[i].to, now);
}
}
int n, u, v, w[5050];
int first, second;
int calc_d(int start)
{
auto max_dis = 0;
dfs_d(start, 0);
for (auto i = 1; i <= n; i++)
{
if (max_dis < dis[i])
{
max_dis = dis[i];
first = i;
}
}
memset(dis, 0, sizeof(dis));
max_dis = 0;
dfs_d(first, 0);
for (auto i = 1; i <= n; i++)
{
if (max_dis < dis[i])
{
max_dis = dis[i];
second = i;
}
}
return max_dis;
}
int dis1[5050], dis2[5050];
int calc_r(int start)
{
memset(dis1, 0, sizeof(dis1));
memset(dis2, 0, sizeof(dis2));
auto max_dis2 = 0;
auto first2 = start, second2 = 0, cnt1 = 0, cnt2 = 0;
max_dis2 = 0;
memset(dis, 0, sizeof(dis));
dfs(first2, 0);
for (auto i = 1; i <= n; i++)
{
if (max_dis2 < dis[i])
{
max_dis2 = dis[i];
second2 = i;
}
if (dis[i])
{
dis1[++cnt1] = dis[i];
}
}
max_dis2 = 0;
memset(dis, 0, sizeof(dis));
dfs(second2, 0);
for (auto i = 1; i <= n; i++)
{
if (max_dis2 < dis[i])
{
max_dis2 = dis[i];
}
if (dis[i])
{
dis2[++cnt2] = dis[i];
}
}
auto idx = 0, max = 99999999;
for (auto i = 1; i <= n; i++)
{
if (dis1[i] && dis2[i])
{
if (max > std::max(dis1[i], dis2[i]))
{
max = std::max(dis1[i], dis2[i]);
idx = i;
}
}
}
return std::max(dis1[idx], dis2[idx]);
}
int main()
{
std::cin >> n;
for (auto i = 1; i < n; i++)
{
std::cin >> u >> v >> w[i];
add(u, v, w[i]);
add(v, u, w[i]);
}
auto ans = calc_d(1);
for (auto i = 1; i < n; i++)
{
deleted = i;
auto d1 = calc_d(first);
auto d2 = calc_d(second);
ans = std::min(ans, std::max({calc_r(first) + calc_r(second) + w[i], d1, d2}));
}
std::cout << ans << std::endl;
return 0;
}