#include <bits/stdc++.h>
using namespace std;
#define mod 998244353
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fll
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
const int maxn=2e5+10;
const int maxt=(1<<20)+10;
int n,q;
int fa[maxt],ch[maxn][2],pp[maxn],sum[maxn],val[maxn],cnode;
inline int right_son(int f,int x){return ch[f][1]==x;}
inline void upd(int x){sum[x]=sum[ch[x][0]]+sum[ch[x][1]]+val[x];}
inline void rotate(int x)
{
	int f=fa[x],gf=fa[f];
	int p=right_son(f,x),q=p^1;
	ch[f][p]=ch[x][q];
	fa[ch[x][q]]=f;
	ch[x][q]=f;
	fa[f]=x;
	fa[x]=gf;
	if(gf)ch[gf][right_son(gf,f)]=x;
	else
	{
		pp[x]=pp[f];
		pp[f]=0;
	}
	upd(f);
	upd(x);
}
inline void splay(int x)
{
	while(fa[x])
	{
		int f=fa[x],gf=fa[f];
		if(!gf)rotate(x);
		else
		{
			if(right_son(f,x)==right_son(gf,f))
			{
				rotate(f);
				rotate(x);
			}
			else
			{
				rotate(x);
				rotate(x);
			}
		}
	}
}
inline void maketree(int x)
{
	fa[x]=ch[x][0]=ch[x][1]=pp[x]=0;
}
inline void access(int x)
{
	splay(x);
	if(ch[x][1])
	{
		pp[ch[x][1]]=x;
		fa[ch[x][1]]=0;
		ch[x][1]=0;
		upd(x);
	}
	while(pp[x])
	{
		int y=pp[x];
		splay(y);
		if(ch[y][1])
		{
			pp[ch[y][1]]=y;
			fa[ch[y][1]]=0;
			ch[y][1]=0;
			upd(y);
		}
		pp[x]=0;
		fa[x]=y;
		ch[y][1]=x;
		upd(y);
		splay(x);
	}
}
inline int getpath(int x)
{
	access(x);
	return sum[x];
}
inline void link(int x,int y)
{
	access(x);
	access(y);
	fa[y]=x;
	ch[x][0]=y;
	upd(x);
}
inline void changeval(int x,int v)
{
	access(x);
	val[x]=v;
	upd(x);
}
int aa[maxn],bb[maxn],cc[maxn],dd[maxn];
vector<int> ee[maxn];
vector<int> g[maxn*2];
int dep[maxn*2];
int pa[21][maxn*2];
void dfs(int x,int fa)
{
	dep[x]=dep[fa]+1;
	pa[0][x]=fa;
	maketree(x);
	for(int i=0;i<g[x].size();i++)
	{
		int to=g[x][i];
		if(to==fa)continue;
		dfs(to,x);
		link(to,x);
	}
}
struct query
{
	int x,y,u,v,id;
	query(){}
	query(int x,int y,int u,int v,int id):x(x),y(y),u(u),v(v),id(id){}
};
int ans[maxn];
vector<query> qs[maxn];
inline int getlca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=0;i<21;i++)
	{
		if((dep[x]-dep[y])>>i&1)x=pa[i][x];
	}
	if(x==y)return x;
	for(int i=20;i>=0;i--)
	{
		if(pa[i][x]!=pa[i][y])
		{
			x=pa[i][x];
			y=pa[i][y];
		}
	}
	return pa[0][x];
}
int main()
{
	scanf("%d%d",&n,&q);
	for(int i=1;i<n;i++)
	{
		scanf("%d%d%d%d",&aa[i],&bb[i],&cc[i],&dd[i]);
		ee[cc[i]].push_back(i+n);
		g[aa[i]].push_back(i+n);
		g[bb[i]].push_back(i+n);
		g[i+n].push_back(aa[i]);
		g[i+n].push_back(bb[i]);
	}
	dfs(1,0);
	for(int k=1;k<21;k++)for(int i=0;i<n+n;i++)pa[k][i]=pa[k-1][pa[k-1][i]];
	for(int i=0;i<q;i++)
	{
		int x,y,u,v;
		scanf("%d%d%d%d",&x,&y,&u,&v,i);
		qs[x].push_back(query(x,y,u,v,i));
	}
	for(int i=1;i<n;i++)
	{
		for(int j=0;j<ee[i].size();j++)
		{
			int eid=ee[i][j];
			changeval(eid,dd[eid-n]);
		}
		for(int j=0;j<qs[i].size();j++)
		{
			int u=qs[i][j].u,v=qs[i][j].v;
			int lca=getlca(u,v);
			ans[qs[i][j].id]-=getpath(u);
			ans[qs[i][j].id]-=getpath(v);
			ans[qs[i][j].id]+=getpath(lca)*2;
		}
		for(int j=0;j<ee[i].size();j++)
		{
			int eid=ee[i][j];
			changeval(eid,1);
		}
		for(int j=0;j<qs[i].size();j++)
		{
			int u=qs[i][j].u,v=qs[i][j].v;
			int lca=getlca(u,v);
			ans[qs[i][j].id]+=getpath(u)*qs[i][j].y;
			ans[qs[i][j].id]+=getpath(v)*qs[i][j].y;
			ans[qs[i][j].id]-=getpath(lca)*2*qs[i][j].y;
		}
		for(int j=0;j<ee[i].size();j++)
		{
			int eid=ee[i][j];
			changeval(eid,0);
		}
	}
	for(int i=n+1;i<n+n;i++)
	{
		changeval(i,dd[i-n]);
	}
	for(int i=1;i<n;i++)
	{
		for(int j=0;j<qs[i].size();j++)
		{
			int u=qs[i][j].u,v=qs[i][j].v;
			int lca=getlca(u,v);
			ans[qs[i][j].id]+=getpath(u);
			ans[qs[i][j].id]+=getpath(v);
			ans[qs[i][j].id]-=getpath(lca)*2;
		}
	}
	for(int i=0;i<q;i++)printf("%d\n",ans[i]);
	return 0;
}

Measured memory_bytes: 85520