/**
 * struct Interval {
 *  int start;
 *  int end;
 *  Interval(int s, int e) : start(start), end(e) {}
 * };
 */
class Solution {
  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
        if (n <= 1) return 0;
        vector<vector<pair<int, int>>> g(n);
        for (int i = 0; i < Tree_edge.size(); ++i) {
            int u = Tree_edge[i].start, v = Tree_edge[i].end, w = Edge_value[i];
            g[u].push_back({v, w});
            g[v].push_back({u, w});
        }

        auto far = [&](int s) {
            vector<long long> d(n, -1);
            queue<int> q;
            q.push(s);
            d[s] = 0;
            int u = s;
            while (!q.empty()) {
                u = q.front();
                q.pop();
                for (auto& e : g[u]) if (d[e.first] == -1) {
                        d[e.first] = d[u] + e.second;
                        q.push(e.first);
                    }
            }
            int id = s;
            long long mx = 0;
            for (int i = 0; i < n; ++i) if (d[i] > mx) mx = d[i], id = i;
            return pair<int, long long>(id, mx);
        };

        auto a = far(0);          // 任选一点
        auto b = far(a.first);    // 到最远点的最远距离即直径
        return b.second;
    }
};