#include<iostream>
#include<vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
using namespace std;
#define ll long long
const int pom = 524288;
ll wyn[1048576];
int n, q;
void pus(int x)
{
if (x >= pom)return;
wyn[2 * x] += wyn[x];
wyn[2 * x + 1] += wyn[x];
wyn[x] = 0;
}
void dod(ll a, int l, int p, int lll, int pp, int x)
{
pus(x);
if (lll > p)return;
if (pp < l)return;
if (pp <= p and lll >= l) {
wyn[x] += a;
return;
}
dod(a, l, p, lll, (lll + pp - 1) / 2, 2 * x);
dod(a, l, p, (lll + pp + 1) / 2, pp, 2 * x + 1);
}
ll oddp = 0;
void odp(int x, int l, int p, int a)
{
pus(a);
if (l > x)return;
if (p < x)return;
if (l == p & x == p)
{
oddp = wyn[a];
return;
}
odp(x, l, (l + p - 1) / 2, a * 2);
odp(x, (l + p + 1) / 2, p, a * 2 + 1);
}
int kto[pom];
int zak[pom];
int jump[pom][20];
int gl[pom];
vector<int>sas[pom];
int num = 0;
int dfs(int x)
{
int p = num;
kto[x] = num;
num++;
for (int i = 0; i < sas[x].size(); i++)
{
if (sas[x][i] == jump[x][0])continue;
jump[sas[x][i]][0] = x;
gl[sas[x][i]] = gl[x] + 1;
p = max(p, dfs(sas[x][i]));
}
zak[x] = p;
return p;
}
void settup()
{
for (int i = 1; i < 19; i++)
{
for (int j = 1; j <= n; j++)
{
jump[i][j] = jump[jump[i][j - 1]][j - 1];
}
}
}
int lca(int a, int b)
{
if (gl[a] < gl[b])swap(a, b);
for (int i = 18; i >= 0; i--)
{
if (gl[jump[a][i]] < gl[b])continue;
a = jump[a][i];
}
if (a == b)return a;
for (int i = 18; i >= 0; i--)
{
if (jump[a][i] == jump[b][i])continue;
a = jump[a][i];
b = jump[b][i];
}
return jump[a][0];
}
vector<vector<ll>>pomoc;
ll odpowiedzi[pom];
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> q;
jump[1][0] = 1;
for (int i = 1; i < n; i++)
{
int a, b, c, d;
cin >> a >> b >> c >> d;
sas[a].push_back(b);
sas[b].push_back(a);
pomoc.push_back({ c,d,a,b });
}
dfs(1);
settup();
for (int i = 0; i < q; i++)
{
int a, b, c;
cin >> a >> b >> c;
pomoc.push_back({ c,10000000000,b,a,i });
}
sort(pomoc.begin(), pomoc.end());
for (int i = 0; i < pomoc.size(); i++)
{
if (pomoc[i].size() == 4)
{
int pp = pomoc[i][2];
if (gl[pomoc[i][3]] > gl[pp])pp = pomoc[i][3];
dod(pomoc[i][1], kto[pp], zak[pp], 0, pom - 1,1);
}
else
{
ll wyn = 0;
oddp = 0;
odp(kto[pomoc[i][2]], 0, pom - 1, 1);
wyn += oddp;
odp(kto[pomoc[i][3]], 0, pom - 1, 1);
wyn += oddp;
odp(kto[lca(pomoc[i][3], pomoc[i][2])], 0, pom - 1, 1);
wyn -= 2 * oddp;
odpowiedzi[pomoc[i][4]] = wyn;
}
}
for (int i = 0; i < q; i++)
{
cout << odpowiedzi[i] << "\n";
}
}
I2luY2x1ZGU8aW9zdHJlYW0+CiNpbmNsdWRlPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiNpbmNsdWRlIDxjbWF0aD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKY29uc3QgaW50IHBvbSA9IDUyNDI4ODsKbGwgd3luWzEwNDg1NzZdOwppbnQgbiwgcTsKdm9pZCBwdXMoaW50IHgpCnsKCWlmICh4ID49IHBvbSlyZXR1cm47Cgl3eW5bMiAqIHhdICs9IHd5blt4XTsKCXd5blsyICogeCArIDFdICs9IHd5blt4XTsKCXd5blt4XSA9IDA7Cn0Kdm9pZCBkb2QobGwgYSwgaW50IGwsIGludCBwLCBpbnQgbGxsLCBpbnQgcHAsIGludCB4KQp7CglwdXMoeCk7CglpZiAobGxsID4gcClyZXR1cm47CglpZiAocHAgPCBsKXJldHVybjsKCWlmIChwcCA8PSBwIGFuZCBsbGwgPj0gbCkgewoJCXd5blt4XSArPSBhOwoJCXJldHVybjsKCX0KCWRvZChhLCBsLCBwLCBsbGwsIChsbGwgKyBwcCAtIDEpIC8gMiwgMiAqIHgpOwoJZG9kKGEsIGwsIHAsIChsbGwgKyBwcCArIDEpIC8gMiwgcHAsIDIgKiB4ICsgMSk7Cn0KbGwgb2RkcCA9IDA7CnZvaWQgb2RwKGludCB4LCBpbnQgbCwgaW50IHAsIGludCBhKQp7CglwdXMoYSk7CglpZiAobCA+IHgpcmV0dXJuOwoJaWYgKHAgPCB4KXJldHVybjsKCWlmIChsID09IHAgJiB4ID09IHApCgl7CgkJb2RkcCA9IHd5blthXTsKCQlyZXR1cm47Cgl9CglvZHAoeCwgbCwgKGwgKyBwIC0gMSkgLyAyLCBhICogMik7CglvZHAoeCwgKGwgKyBwICsgMSkgLyAyLCBwLCBhICogMiArIDEpOwp9CmludCBrdG9bcG9tXTsKaW50IHpha1twb21dOwppbnQganVtcFtwb21dWzIwXTsKaW50IGdsW3BvbV07CnZlY3RvcjxpbnQ+c2FzW3BvbV07CmludCBudW0gPSAwOwppbnQgZGZzKGludCB4KQp7CglpbnQgcCA9IG51bTsKCWt0b1t4XSA9IG51bTsKCW51bSsrOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBzYXNbeF0uc2l6ZSgpOyBpKyspCgl7CgkJaWYgKHNhc1t4XVtpXSA9PSBqdW1wW3hdWzBdKWNvbnRpbnVlOwoJCWp1bXBbc2FzW3hdW2ldXVswXSA9IHg7CgkJZ2xbc2FzW3hdW2ldXSA9IGdsW3hdICsgMTsKCQlwID0gbWF4KHAsIGRmcyhzYXNbeF1baV0pKTsKCX0KCXpha1t4XSA9IHA7CglyZXR1cm4gcDsKfQp2b2lkIHNldHR1cCgpCnsKCWZvciAoaW50IGkgPSAxOyBpIDwgMTk7IGkrKykKCXsKCQlmb3IgKGludCBqID0gMTsgaiA8PSBuOyBqKyspCgkJewoJCQlqdW1wW2ldW2pdID0ganVtcFtqdW1wW2ldW2ogLSAxXV1baiAtIDFdOwoJCX0KCX0KfQppbnQgbGNhKGludCBhLCBpbnQgYikKewoJaWYgKGdsW2FdIDwgZ2xbYl0pc3dhcChhLCBiKTsKCWZvciAoaW50IGkgPSAxODsgaSA+PSAwOyBpLS0pCgl7CgkJaWYgKGdsW2p1bXBbYV1baV1dIDwgZ2xbYl0pY29udGludWU7CgkJYSA9IGp1bXBbYV1baV07Cgl9CglpZiAoYSA9PSBiKXJldHVybiBhOwoJZm9yIChpbnQgaSA9IDE4OyBpID49IDA7IGktLSkKCXsKCQlpZiAoanVtcFthXVtpXSA9PSBqdW1wW2JdW2ldKWNvbnRpbnVlOwoJCWEgPSBqdW1wW2FdW2ldOwoJCWIgPSBqdW1wW2JdW2ldOwoJfQoJcmV0dXJuIGp1bXBbYV1bMF07Cn0KdmVjdG9yPHZlY3RvcjxsbD4+cG9tb2M7CmxsIG9kcG93aWVkemlbcG9tXTsKaW50IG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwoJY2luLnRpZSgwKTsKCWNpbiA+PiBuID4+IHE7CglqdW1wWzFdWzBdID0gMTsKCWZvciAoaW50IGkgPSAxOyBpIDwgbjsgaSsrKQoJewoJCWludCBhLCBiLCBjLCBkOwoJCWNpbiA+PiBhID4+IGIgPj4gYyA+PiBkOwoJCXNhc1thXS5wdXNoX2JhY2soYik7CgkJc2FzW2JdLnB1c2hfYmFjayhhKTsKCQlwb21vYy5wdXNoX2JhY2soeyBjLGQsYSxiIH0pOwoJfQoJZGZzKDEpOwoJc2V0dHVwKCk7Cglmb3IgKGludCBpID0gMDsgaSA8IHE7IGkrKykKCXsKCQlpbnQgYSwgYiwgYzsKCQljaW4gPj4gYSA+PiBiID4+IGM7CgkJcG9tb2MucHVzaF9iYWNrKHsgYywxMDAwMDAwMDAwMCxiLGEsaSB9KTsKCX0KCXNvcnQocG9tb2MuYmVnaW4oKSwgcG9tb2MuZW5kKCkpOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBwb21vYy5zaXplKCk7IGkrKykKCXsKCQlpZiAocG9tb2NbaV0uc2l6ZSgpID09IDQpCgkJewoJCQlpbnQgcHAgPSBwb21vY1tpXVsyXTsKCQkJaWYgKGdsW3BvbW9jW2ldWzNdXSA+IGdsW3BwXSlwcCA9IHBvbW9jW2ldWzNdOwoJCQlkb2QocG9tb2NbaV1bMV0sIGt0b1twcF0sIHpha1twcF0sIDAsIHBvbSAtIDEsMSk7CgkJfQoJCWVsc2UKCQl7CgkJCWxsIHd5biA9IDA7CgkJCW9kZHAgPSAwOwoJCQlvZHAoa3RvW3BvbW9jW2ldWzJdXSwgMCwgcG9tIC0gMSwgMSk7CgkJCXd5biArPSBvZGRwOwoJCQlvZHAoa3RvW3BvbW9jW2ldWzNdXSwgMCwgcG9tIC0gMSwgMSk7CgkJCXd5biArPSBvZGRwOwoJCQlvZHAoa3RvW2xjYShwb21vY1tpXVszXSwgcG9tb2NbaV1bMl0pXSwgMCwgcG9tIC0gMSwgMSk7CgkJCXd5biAtPSAyICogb2RkcDsKCQkJb2Rwb3dpZWR6aVtwb21vY1tpXVs0XV0gPSB3eW47CgkJfQoJfQoJZm9yIChpbnQgaSA9IDA7IGkgPCBxOyBpKyspCgl7CgkJY291dCA8PCBvZHBvd2llZHppW2ldIDw8ICJcbiI7Cgl9Cn0=