N = int(input())
link = {}
for i in range(N - 1):
a, b, w = map(int, input().split())
if a not in link:
link[a] = []
if b not in link:
link[b] = []
link[a].append((b, w))
link[b].append((a, w))
dis = [None] * (N+1)
# 第一次dfs遍历节点,用子节点到其子节点的最大距离更新父节点到其子节点的最大距离,每个树节点代表了该节点到其子节点的所有路径的最大值
# 需要通知保存最大值和次大值,方便进行第二次dfs, 保存次大值是因为父节点到子节点最长路径的方向如果刚好就是某个子节点的方向,那第二次
# dfs时候就没法用这个值来更新子节点往父节点方向的最长路径了,所以要把次大值存下来备用,第二次dfs可能会需要用次大值来更新子节点的数据
def dfs1(root, prev = None):
max1, child1, max2, child2 = 0, 0, 0, 0
for child, path_len in link[root]:
if child == prev:
continue
new_len = dfs1(child, root) + path_len
if new_len > max1:
max1, max2 = new_len, max1
child1, child2 = child, child1
elif new_len > max2:
max2 = new_len
child2 = child
dis[root] = [max1, child1, max2, child2]
return max1
# 第二次dfs用用父节点往上走或者不往某子节点方向走的路径最大值更该新子节点往这个父节点方向走的最大路径
def dfs2(root, prev = None):
for child, path_len in link[root]:
if child == prev:
continue
length = dis[root][2] + path_len if dis[root][1] == child else dis[root][0] + path_len
if length > dis[child][0]:
dis[child][2], dis[child][3] = dis[child][0], dis[child][1]
dis[child][0], dis[child][1] = length, root
elif length > dis[child][2]:
dis[child][2], dis[child][3] = length, root
dfs2(child, root)
dfs1(1)
dfs2(1)
ans = 0x7fffffff
for i in range(1, N+1):
ans = min(ans, dis[i][0])
print(ans)