n = gets.to_i g = Array.new(n) { [] } (n - 1).times do u, v, w = gets.split.map(&:to_i) next if w < 0 u -= 1 v -= 1 g[u] << [v, w] g[v] << [u, w] end def dfs(g, seen, now, cost) max = [now, cost] g[now].each do |nxt, w| next if seen[nxt] seen[nxt] = true res = dfs(g, seen, nxt, cost + w) max = res if max[1] < res[1] end max end max = 0 seen = Array.new n, false n.times do |i| next if seen[i] seen.fill(false).tap { _1[i] = true } far1 = dfs(g, seen, i, 0)[0] seen2 = Array.new(n, false).tap { _1[far1] = true } far2 = dfs(g, seen2, far1, 0)[1] max = far2 if max < far2 end puts max