#include "bits/stdc++.h"

using namespace std;

// #define int long long

vector<int> solve(
vector<std::pair<int, int>> roads,
vector<long long> d,
vector<int> s,
vector<int> t,
vector<bool> I
) {
    int n = (int) roads.size() + 1, m = (int) s.size();
    vector<vector<int>> g(n + 1, vector<int> ());
    for (auto i : roads) {
        i.first++, i.second++;
        g[i.first].push_back(i.second);
        g[i.second].push_back(i.first);
    }

    vector<int> dst(n + 1);
    vector<vector<int>> up(n + 1, vector<int> (20, -1));
    function<void(int, int)> dfs1 = [&] (int u, int p) {
        up[u][0] = p;
        for (int msk = 1; msk < 20; msk++)
            if (up[u][msk - 1] != -1)
                up[u][msk] = up[up[u][msk - 1]][msk - 1];
        for (auto v : g[u]) {
            if (v != p) {
                dst[v] = dst[u] + 1;
                dfs1(v, u);
            }
        }
    }; dfs1(1, -1);

    function<int(int, int)> goup = [&] (int u1, int dd1) {
        int u = u1, dd = dd1;
        for (int msk = 0; msk < 19; msk++)
            if ((1 << msk) & dd) {
                u = up[u][msk];
            }
        return u;
    };

    function<int(int, int)> lca = [&] (int u1, int v1) {
        int u = u1, v = v1;
        if (dst[u] > dst[v]) {
            u = goup(u, dst[u] - dst[v]);
        } else if (dst[v] > dst[u]) {
            v = goup(v, dst[v] - dst[u]);
        }
        if (u == v) return u;
        // return 1;
        for (int msk = 19; msk >= 0; msk--)
            if (up[u][msk] != up[v][msk]) {
                u = up[u][msk];
                v = up[v][msk];
            }
        return up[u][0];
    };

    function<int(int, int)> distance = [&] (int u, int v) {
        return dst[u] + dst[v] - 2 * dst[lca(u, v)];
    };

    set<pair<int, int>> q;
    vector<int> ans(m, 0), ras(m);
    for (int i = 0; i < m; i++) {
        s[i]++, t[i]++;
        ras[i] = distance(s[i], t[i]);
        if (I[i] == 1) {
            ans[i] = ras[i] + 1;
            q.insert({0, i});
        }
    }

    return ans;
}

// int32_t main() {

//     ios::sync_with_stdio(false);
//     cin.tie(nullptr); cout.tie(nullptr);

//     int T = 1;
//     // cin >> T;
//     while (T--) {
//         int n, m;
//         cin >> n >> m;
//         vector<pair<int, int>> r;
//         for (int i = 1; i < n; i++) {
//             int u, v; cin >> u >> v;
//             r.push_back({u, v});
//         }

//         vector<long long> d(m);
//         vector<int> s(m), t(m);
//         vector<bool> I(m);
//         for (int i = 0; i < m; i++) {
//             int x;
//             cin >> d[i] >> s[i] >> t[i] >> x;
//             I[i] = x;
//         }

//         auto ans = solve(r, d, s, t, I);
//         // cout << ans[2] << '\n';
//         for (auto i : ans)
//             cout << i << '\n';
//     }

//     return 0;
// }