/**
 * struct Interval {
 *  int start;
 *  int end;
 *  Interval(int s, int e) : start(start), end(e) {}
 * };
 */
class Solution {
  private:
    vector<vector<pair<int, int>>> graph; // 邻接表表示,pair<节点, 边权>
    vector<bool> visited;
    int maxDist;
    int farthestNode;

    // DFS函数,用于遍历并找出最远距离
    void dfs(int node, int dist) {
        visited[node] = true;
        if (dist > maxDist) {
            maxDist = dist;
            farthestNode = node;
        }

        for (auto& edge : graph[node]) {
            if (!visited[edge.first]) {
                dfs(edge.first, dist + edge.second);
            }
        }
    }
  public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 树的直径
     * @param n int整型 树的节点个数
     * @param Tree_edge Interval类vector 树的边
     * @param Edge_value int整型vector 边的权值
     * @return int整型
     */
    int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {
        // write code here
        // 检查输入是不是有问题
        // 以输入的第二部分为基准,
        // 第一部分的数字大或者小不影响,第二部分有 n 对点对,在一棵树里节点数就是 n + 1。
        // 第三部分多或者少也同样不影响,少了我们补 0,多了就不读入多余那部分就好了。
        n = Tree_edge.size() + 1; // 节点数应为边数+1
        if (Edge_value.size() < Tree_edge.size()) {
            Edge_value.resize(Tree_edge.size(), 0); // 边权不足时补0
        }

        // 处理完输入之后再建图
        graph.resize(n);
        visited.resize(n, false);

        for (int i = 0; i < Tree_edge.size(); i++) {
            int u = Tree_edge[i].start;
            int v = Tree_edge[i].end;
            int weight = Edge_value[i];
            graph[u].push_back({v, weight});
            graph[v].push_back({u, weight});
        }

        // 第一次DFS找到最远的节点
        maxDist = 0;
        dfs(0, 0);

        // 第二次DFS从最远的节点开始
        fill(visited.begin(), visited.end(), false);
        maxDist = 0;
        dfs(farthestNode, 0);

        return maxDist;
    }
};