#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010, M = N * 2;
int n;
int h[N], e[M], w[M], ne[M], idx;
int ans;
// 添加一条边,a和b是边的两个端点,c是边权
void add(int a, int b, int c)
{
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
}
// 深度优先搜索,u表示当前节点,father表示当前节点的父节点
// 返回值表示从当前节点往下走的最大长度
int dfs(int u, int father)
{
int dist = 0; // 表示从当前点往下走的最大长度
int d1 = 0, d2 = 0;
// 遍历当前节点的所有孩子节点
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
// 如果孩子节点是当前节点的父节点,则跳过
if (j == father) continue;
// 递归遍历孩子节点,并计算从孩子节点往下走的最大长度
int d = dfs(j, u) + w[i];
// 更新从当前节点往下走的最大长度
dist = max(dist, d);
// 维护当前节点的最长路径d1和次长路径d2
if (d >= d1) d2 = d1, d1 = d;
else if (d > d2) d2 = d;
}
// 计算当前节点的直径,并更新全局最大值ans
ans = max(ans, d1 + d2);
// 返回从当前节点往下走的最大长度
return dist;
}
int main()
{
cin >> n;
memset(h, -1, sizeof h);
// 读入所有边,建立树的邻接表
for (int i = 0; i < n - 1; i ++ )
{
int a, b, c;
cin >> a >> b >> c;
add(a, b, c), add(b, a, c);
}
// 从根节点开始进行深度优先搜索
dfs(1, -1);
// 输出树的直径
cout << ans << endl;
return 0;
}