#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
using namespace std;
const int maxn = 1e5;
const int maxlog = 18;
struct Query
{
int id, x, y, mobius;
};
struct Edge
{
int x, c, d;
};
int n, q, beg[maxn + 10], fin[maxn + 10], par[maxn + 10][maxlog + 2], timer = 0;
ll cnt[maxn + 10], sum[maxn + 10], ans[maxn + 10], dist[maxn + 10];
vector<Edge> adj[maxn + 10];
vector<Query> query[maxn + 10];
void precompute(int top, int p = -1)
{
beg[top] = ++timer;
for (Edge e : adj[top])
{
int next_top = e.x;
int w = e.d;
if (next_top == p) continue;
dist[next_top] = dist[top] + w;
par[next_top][0] = top;
precompute(next_top, top);
}
fin[top] = timer;
}
bool is_inside(int x, int y)
{
if (!x) return 1;
return beg[x] <= beg[y] && fin[y] <= fin[x];
}
int getLCA(int x, int y)
{
if (is_inside(x, y)) return x;
if (is_inside(y, x)) return y;
for (int i = maxlog; i >= 0; i--)
if (!is_inside(par[x][i], y))
x = par[x][i];
return par[x][0];
}
void dfs(int top, int par = -1)
{
for (Query ask : query[top])
{
int id = ask.id;
int x = ask.x;
int y = ask.y;
int mobious = ask.mobius;
ans[id] += (cnt[x] * y - sum[x]) * mobious;
}
for (Edge e : adj[top])
{
int next_top = e.x;
int c = e.c;
int w = e.d;
if (next_top == par) continue;
cnt[c]++;
sum[c] += w;
dfs(next_top, top);
cnt[c]--;
sum[c] -= w;
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("COLORFUL_TREE.INP", "r"))
{
freopen("COLORFUL_TREE.INP", "r", stdin);
freopen("COLORFUL_TREE.OUT", "w", stdout);
}
cin >> n >> q;
for (int i = 1; i < n; i++)
{
int x, y, c, d;
cin >> x >> y >> c >> d;
adj[x].push_back({y, c, d});
adj[y].push_back({x, c, d});
}
precompute(1);
for (int j = 1; j <= maxlog; j++)
for (int i = 1; i <= n; i++)
par[i][j] = par[par[i][j - 1]][j - 1];
for (int i = 1; i <= q; i++)
{
int x, y, u, v;
cin >> x >> y >> u >> v;
int lca = getLCA(u, v);
ans[i] = dist[u] + dist[v] - 2 * dist[lca];
query[u].push_back({i, x, y, 1});
query[v].push_back({i, x, y, 1});
query[lca].push_back({i, x, y, -2});
}
dfs(1);
for (int i = 1; i <= q; i++)
cout << ans[i], el;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNvbnN0IGludCBtYXhuID0gMWU1Owpjb25zdCBpbnQgbWF4bG9nID0gMTg7CgpzdHJ1Y3QgUXVlcnkKewogICAgaW50IGlkLCB4LCB5LCBtb2JpdXM7Cn07CnN0cnVjdCBFZGdlCnsKICAgIGludCB4LCBjLCBkOwp9OwoKaW50IG4sIHEsIGJlZ1ttYXhuICsgMTBdLCBmaW5bbWF4biArIDEwXSwgcGFyW21heG4gKyAxMF1bbWF4bG9nICsgMl0sIHRpbWVyID0gMDsKbGwgY250W21heG4gKyAxMF0sIHN1bVttYXhuICsgMTBdLCBhbnNbbWF4biArIDEwXSwgZGlzdFttYXhuICsgMTBdOwp2ZWN0b3I8RWRnZT4gYWRqW21heG4gKyAxMF07CnZlY3RvcjxRdWVyeT4gcXVlcnlbbWF4biArIDEwXTsKCnZvaWQgcHJlY29tcHV0ZShpbnQgdG9wLCBpbnQgcCA9IC0xKQp7CiAgICBiZWdbdG9wXSA9ICsrdGltZXI7CiAgICBmb3IgKEVkZ2UgZSA6IGFkalt0b3BdKQogICAgewogICAgICAgIGludCBuZXh0X3RvcCA9IGUueDsKICAgICAgICBpbnQgdyA9IGUuZDsKICAgICAgICBpZiAobmV4dF90b3AgPT0gcCkgY29udGludWU7CiAgICAgICAgZGlzdFtuZXh0X3RvcF0gPSBkaXN0W3RvcF0gKyB3OwogICAgICAgIHBhcltuZXh0X3RvcF1bMF0gPSB0b3A7CiAgICAgICAgcHJlY29tcHV0ZShuZXh0X3RvcCwgdG9wKTsKICAgIH0KICAgIGZpblt0b3BdID0gdGltZXI7Cn0KYm9vbCBpc19pbnNpZGUoaW50IHgsIGludCB5KQp7CiAgICBpZiAoIXgpIHJldHVybiAxOwogICAgcmV0dXJuIGJlZ1t4XSA8PSBiZWdbeV0gJiYgZmluW3ldIDw9IGZpblt4XTsKfQppbnQgZ2V0TENBKGludCB4LCBpbnQgeSkKewogICAgaWYgKGlzX2luc2lkZSh4LCB5KSkgcmV0dXJuIHg7CiAgICBpZiAoaXNfaW5zaWRlKHksIHgpKSByZXR1cm4geTsKICAgIGZvciAoaW50IGkgPSBtYXhsb2c7IGkgPj0gMDsgaS0tKQogICAgICAgIGlmICghaXNfaW5zaWRlKHBhclt4XVtpXSwgeSkpCiAgICAgICAgICAgIHggPSBwYXJbeF1baV07CiAgICByZXR1cm4gcGFyW3hdWzBdOwp9CnZvaWQgZGZzKGludCB0b3AsIGludCBwYXIgPSAtMSkKewogICAgZm9yIChRdWVyeSBhc2sgOiBxdWVyeVt0b3BdKQogICAgewogICAgICAgIGludCBpZCA9IGFzay5pZDsKICAgICAgICBpbnQgeCA9IGFzay54OwogICAgICAgIGludCB5ID0gYXNrLnk7CiAgICAgICAgaW50IG1vYmlvdXMgPSBhc2subW9iaXVzOwogICAgICAgIGFuc1tpZF0gKz0gKGNudFt4XSAqIHkgLSBzdW1beF0pICogbW9iaW91czsKICAgIH0KICAgIGZvciAoRWRnZSBlIDogYWRqW3RvcF0pCiAgICB7CiAgICAgICAgaW50IG5leHRfdG9wID0gZS54OwogICAgICAgIGludCBjID0gZS5jOwogICAgICAgIGludCB3ID0gZS5kOwogICAgICAgIGlmIChuZXh0X3RvcCA9PSBwYXIpIGNvbnRpbnVlOwogICAgICAgIGNudFtjXSsrOwogICAgICAgIHN1bVtjXSArPSB3OwogICAgICAgIGRmcyhuZXh0X3RvcCwgdG9wKTsKICAgICAgICBjbnRbY10tLTsKICAgICAgICBzdW1bY10gLT0gdzsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGlmIChmb3BlbigiQ09MT1JGVUxfVFJFRS5JTlAiLCAiciIpKQogICAgewogICAgICAgIGZyZW9wZW4oIkNPTE9SRlVMX1RSRUUuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiQ09MT1JGVUxfVFJFRS5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG4gPj4gcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIGludCB4LCB5LCBjLCBkOwogICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gYyA+PiBkOwogICAgICAgIGFkalt4XS5wdXNoX2JhY2soe3ksIGMsIGR9KTsKICAgICAgICBhZGpbeV0ucHVzaF9iYWNrKHt4LCBjLCBkfSk7CiAgICB9CiAgICBwcmVjb21wdXRlKDEpOwogICAgZm9yIChpbnQgaiA9IDE7IGogPD0gbWF4bG9nOyBqKyspCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgICAgICBwYXJbaV1bal0gPSBwYXJbcGFyW2ldW2ogLSAxXV1baiAtIDFdOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKQogICAgewogICAgICAgIGludCB4LCB5LCB1LCB2OwogICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gdSA+PiB2OwogICAgICAgIGludCBsY2EgPSBnZXRMQ0EodSwgdik7CiAgICAgICAgYW5zW2ldID0gZGlzdFt1XSArIGRpc3Rbdl0gLSAyICogZGlzdFtsY2FdOwogICAgICAgIHF1ZXJ5W3VdLnB1c2hfYmFjayh7aSwgeCwgeSwgMX0pOwogICAgICAgIHF1ZXJ5W3ZdLnB1c2hfYmFjayh7aSwgeCwgeSwgMX0pOwogICAgICAgIHF1ZXJ5W2xjYV0ucHVzaF9iYWNrKHtpLCB4LCB5LCAtMn0pOwogICAgfQogICAgZGZzKDEpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gcTsgaSsrKQogICAgICAgIGNvdXQgPDwgYW5zW2ldLCBlbDsKfQ==