import java.util.*;
public class Solution {
   class Node{  // 邻接点结构
        int id, dist; //id表示节点编号,dist表示距离
        public Node(){}
        public Node(int id, int dist){
            this.id = id;
            this.dist = dist;
        }
    }
    int maxv = 0;
    List<Node>[] g; // 保存邻接点

    public int solve (int n, Interval[] Tree_edge, int[] Edge_value) {
        g = new List[n];
        for (int i = 0; i < n; ++i){
            g[i] = new LinkedList<>();
        }

        for (int i = 0; i < n - 1; ++i){
            int x = Tree_edge[i].start, y = Tree_edge[i].end;
            g[x].add(new Node(y, Edge_value[i]));
            g[y].add(new Node(x, Edge_value[i]));

        }
        dfs(0, -1);
        return maxv;
    }
    public int dfs(int root, int parent){
        List<Integer> list  = new LinkedList<>();
        for (Node v : g[root]){
            if (v.id == parent) continue;
            list.add(dfs(v.id, root) + v.dist);
        }
        Collections.sort(list);
        int n = list.size(), val = 0;
        for (int i = n - 1; i >= 0 && i >= n - 2; --i){
            val += list.get(i);
        }
        maxv = Math.max(maxv, val);
        return n == 0 ? 0 : list.get(n - 1);
    }
}