#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";
	}
}