#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 100100
#define pb push_back
int n,q;
vector<tuple<int,int,int> > adj[MAX];
int head[MAX], w[MAX], depth[MAX], treesize[MAX], pos[MAX], parent[MAX], root[MAX], w1[MAX], a[MAX];
int cnt = 0, cur = 0;
int sum[(int)3e6], lc[(int)3e6], rc[(int)3e6];
ll d[MAX];
int build(int l, int r)
{
int pos = ++cur;
if(l == r){
sum[pos] = 0;
lc[pos] = -1;
rc[pos] = -1;
return pos;
}else{
int m = (l+r)>>1;
sum[pos] = 0;
lc[pos] = build(l,m);
rc[pos] = build(m+1,r);
return pos;
}
}
int update(int l, int r, int po, int prev)
{
int pos = ++cur;
if(l == r){
sum[pos] = sum[prev] + 1;
lc[pos] = -1;
rc[pos] = -1;
return pos;
}else{
int m = (l+r)>>1;
if(po <= m){
lc[pos] = update(l,m,po,lc[prev]);
rc[pos] = rc[prev];
sum[pos] = sum[lc[pos]] + sum[rc[pos]];
}else{
rc[pos] = update(m+1,r,po,rc[prev]);
lc[pos] = lc[prev];
sum[pos] = sum[lc[pos]] + sum[rc[pos]];
}
return pos;
}
}
int get(int nodl, int nodr, int l, int r, int u, int v)
{
if(r < u || v < l) return 0;
if(u <= l && r <= v) return nodr[sum] - nodl[sum];
int m = (l+r)>>1;
return get(lc[nodl],lc[nodr],l,m,u,v) + get(rc[nodl], rc[nodr],m+1,r,u,v);
}
void nhap()
{
cin >> n >> q;
for(int i = 0; i<n-1; i++){
int a,b,c,d; cin >> a >> b >> c >> d;
adj[a].pb(make_tuple(b,c,d));
adj[b].pb(make_tuple(a,c,d));
}
parent[1] = 0;
depth[1] = 0;
w[1] = 0;
d[1] = 0;
}
void dfs(int v)
{
int index = -1;
treesize[v] = 1;
for(int i = 0; i< adj[v].size(); i++) if(get<0>(adj[v][i]) != parent[v]){
int u = get<0>(adj[v][i]);
parent[u] = v;
w[u] = get<2>(adj[v][i]);
w1[u] = get<1>(adj[v][i]);
depth[u] = depth[v] + 1;
d[u] = d[v] + get<1>(adj[v][i]);
dfs(u);
treesize[v] += treesize[u];
if(index == -1 || treesize[u] > treesize[get<0>(adj[v][index])]) index = i;
}
if(index != 0 && index != -1) swap(adj[v][0], adj[v][index]);
}
void decompose(int v, int h)
{
head[v] = h;
pos[v] = ++cnt;
for(tuple<int,int,int> x : adj[v]) if(get<0>(x) != parent[v]){
if(get<0>(x) == get<0>(adj[v][0])) decompose(get<0>(x),h);
else decompose(get<0>(x), get<0>(x));
}
}
void process()
{
dfs(1);
decompose(1,1);
root[0] = build(1,1e5);
for(int i = 1; i<=n; i++) a[pos[i]] = w[i];
for(int i = 1; i<=n; i++) root[i] = update(1,1e5,a[i],root[i-1]);
while(q--){
int u,v,k,y; cin >> u >> v >> k >> y;
int _u = u;
int _v = v;
int dem = 0;
while(head[u] != head[v]){
if(depth[head[u]] < depth[head[v]]) swap(u,v);
dem += get(root[pos[head[u]] -1], root[pos[u]],1,1e5,y,y);
u = parent[head[u]];
}
if(depth[u] > depth[v]) swap(u,v);
ll sum = d[_u] + d[_v] - 2*d[u];
dem += get(root[pos[u]], root[pos[v]],1,1e5,y,y);
dem = depth[_u] + depth[_v] - 2*depth[u] - dem;
if(dem <= k){
cout << sum << '\n';
}else{
cout << -1 << '\n';
}
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0);
nhap();
process();
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgTUFYIDEwMDEwMAojZGVmaW5lIHBiIHB1c2hfYmFjawoKaW50IG4scTsKdmVjdG9yPHR1cGxlPGludCxpbnQsaW50PiA+IGFkaltNQVhdOwppbnQgaGVhZFtNQVhdLCB3W01BWF0sIGRlcHRoW01BWF0sIHRyZWVzaXplW01BWF0sIHBvc1tNQVhdLCBwYXJlbnRbTUFYXSwgcm9vdFtNQVhdLCB3MVtNQVhdLCBhW01BWF07CmludCBjbnQgPSAwLCBjdXIgPSAwOwppbnQgc3VtWyhpbnQpM2U2XSwgbGNbKGludCkzZTZdLCByY1soaW50KTNlNl07CmxsIGRbTUFYXTsKCmludCBidWlsZChpbnQgbCwgaW50IHIpCnsKICAgIGludCBwb3MgPSArK2N1cjsKICAgIGlmKGwgPT0gcil7CiAgICAgICAgc3VtW3Bvc10gPSAwOwogICAgICAgIGxjW3Bvc10gPSAtMTsKICAgICAgICByY1twb3NdID0gLTE7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH1lbHNlewogICAgICAgIGludCBtID0gKGwrcik+PjE7CiAgICAgICAgc3VtW3Bvc10gPSAwOwogICAgICAgIGxjW3Bvc10gPSBidWlsZChsLG0pOwogICAgICAgIHJjW3Bvc10gPSBidWlsZChtKzEscik7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH0KfQoKaW50IHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCBwbywgaW50IHByZXYpCnsKICAgIGludCBwb3MgPSArK2N1cjsKICAgIGlmKGwgPT0gcil7CiAgICAgICAgc3VtW3Bvc10gPSBzdW1bcHJldl0gKyAxOwogICAgICAgIGxjW3Bvc10gPSAtMTsKICAgICAgICByY1twb3NdID0gLTE7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH1lbHNlewogICAgICAgIGludCBtID0gKGwrcik+PjE7CiAgICAgICAgaWYocG8gPD0gbSl7CiAgICAgICAgICAgIGxjW3Bvc10gPSB1cGRhdGUobCxtLHBvLGxjW3ByZXZdKTsKICAgICAgICAgICAgcmNbcG9zXSA9IHJjW3ByZXZdOwogICAgICAgICAgICBzdW1bcG9zXSA9IHN1bVtsY1twb3NdXSArIHN1bVtyY1twb3NdXTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgcmNbcG9zXSA9IHVwZGF0ZShtKzEscixwbyxyY1twcmV2XSk7CiAgICAgICAgICAgIGxjW3Bvc10gPSBsY1twcmV2XTsKICAgICAgICAgICAgc3VtW3Bvc10gPSBzdW1bbGNbcG9zXV0gKyBzdW1bcmNbcG9zXV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwb3M7CiAgICB9Cn0KCmludCBnZXQoaW50IG5vZGwsIGludCBub2RyLCBpbnQgbCwgaW50IHIsIGludCB1LCBpbnQgdikKewogICAgaWYociA8IHUgfHwgdiA8IGwpIHJldHVybiAwOwogICAgaWYodSA8PSBsICYmIHIgPD0gdikgcmV0dXJuIG5vZHJbc3VtXSAtIG5vZGxbc3VtXTsKICAgIGludCBtID0gKGwrcik+PjE7CiAgICByZXR1cm4gZ2V0KGxjW25vZGxdLGxjW25vZHJdLGwsbSx1LHYpICsgZ2V0KHJjW25vZGxdLCByY1tub2RyXSxtKzEscix1LHYpOwp9Cgp2b2lkIG5oYXAoKQp7CiAgICBjaW4gPj4gbiA+PiBxOwogICAgZm9yKGludCBpID0gMDsgaTxuLTE7IGkrKyl7CiAgICAgICAgaW50IGEsYixjLGQ7IGNpbiA+PiBhID4+IGIgPj4gYyA+PiBkOwogICAgICAgIGFkalthXS5wYihtYWtlX3R1cGxlKGIsYyxkKSk7CiAgICAgICAgYWRqW2JdLnBiKG1ha2VfdHVwbGUoYSxjLGQpKTsKICAgIH0KICAgIHBhcmVudFsxXSA9IDA7CiAgICBkZXB0aFsxXSA9IDA7CiAgICB3WzFdID0gMDsKICAgIGRbMV0gPSAwOwp9Cgp2b2lkIGRmcyhpbnQgdikKewogICAgaW50IGluZGV4ID0gLTE7CiAgICB0cmVlc2l6ZVt2XSA9IDE7CiAgICBmb3IoaW50IGkgPSAwOyBpPCBhZGpbdl0uc2l6ZSgpOyBpKyspIGlmKGdldDwwPihhZGpbdl1baV0pICE9IHBhcmVudFt2XSl7CiAgICAgICAgaW50IHUgPSBnZXQ8MD4oYWRqW3ZdW2ldKTsKICAgICAgICBwYXJlbnRbdV0gPSB2OwogICAgICAgIHdbdV0gPSBnZXQ8Mj4oYWRqW3ZdW2ldKTsKICAgICAgICB3MVt1XSA9IGdldDwxPihhZGpbdl1baV0pOwogICAgICAgIGRlcHRoW3VdID0gZGVwdGhbdl0gKyAxOwogICAgICAgIGRbdV0gPSBkW3ZdICsgZ2V0PDE+KGFkalt2XVtpXSk7CiAgICAgICAgZGZzKHUpOwogICAgICAgIHRyZWVzaXplW3ZdICs9IHRyZWVzaXplW3VdOwogICAgICAgIGlmKGluZGV4ID09IC0xIHx8IHRyZWVzaXplW3VdID4gdHJlZXNpemVbZ2V0PDA+KGFkalt2XVtpbmRleF0pXSkgaW5kZXggPSBpOwogICAgfQogICAgaWYoaW5kZXggIT0gMCAmJiBpbmRleCAhPSAtMSkgc3dhcChhZGpbdl1bMF0sIGFkalt2XVtpbmRleF0pOwp9Cgp2b2lkIGRlY29tcG9zZShpbnQgdiwgaW50IGgpCnsKICAgIGhlYWRbdl0gPSBoOwogICAgcG9zW3ZdID0gKytjbnQ7CiAgICBmb3IodHVwbGU8aW50LGludCxpbnQ+IHggOiBhZGpbdl0pIGlmKGdldDwwPih4KSAhPSBwYXJlbnRbdl0pewogICAgICAgIGlmKGdldDwwPih4KSA9PSBnZXQ8MD4oYWRqW3ZdWzBdKSkgZGVjb21wb3NlKGdldDwwPih4KSxoKTsKICAgICAgICBlbHNlIGRlY29tcG9zZShnZXQ8MD4oeCksIGdldDwwPih4KSk7CiAgICB9Cn0KCnZvaWQgcHJvY2VzcygpCnsKICAgIGRmcygxKTsKICAgIGRlY29tcG9zZSgxLDEpOwogICAgcm9vdFswXSA9IGJ1aWxkKDEsMWU1KTsKICAgIGZvcihpbnQgaSA9IDE7IGk8PW47IGkrKykgYVtwb3NbaV1dID0gd1tpXTsKICAgIGZvcihpbnQgaSA9IDE7IGk8PW47IGkrKykgcm9vdFtpXSA9IHVwZGF0ZSgxLDFlNSxhW2ldLHJvb3RbaS0xXSk7CiAgICB3aGlsZShxLS0pewogICAgICAgIGludCB1LHYsayx5OyBjaW4gPj4gdSA+PiB2ID4+IGsgPj4geTsKICAgICAgICBpbnQgX3UgPSB1OwogICAgICAgIGludCBfdiA9IHY7CiAgICAgICAgaW50IGRlbSA9IDA7CiAgICAgICAgd2hpbGUoaGVhZFt1XSAhPSBoZWFkW3ZdKXsKICAgICAgICAgICAgaWYoZGVwdGhbaGVhZFt1XV0gPCBkZXB0aFtoZWFkW3ZdXSkgc3dhcCh1LHYpOwogICAgICAgICAgICBkZW0gKz0gZ2V0KHJvb3RbcG9zW2hlYWRbdV1dIC0xXSwgcm9vdFtwb3NbdV1dLDEsMWU1LHkseSk7CiAgICAgICAgICAgIHUgPSBwYXJlbnRbaGVhZFt1XV07CiAgICAgICAgfQogICAgICAgIGlmKGRlcHRoW3VdID4gZGVwdGhbdl0pIHN3YXAodSx2KTsKICAgICAgICBsbCBzdW0gPSBkW191XSArIGRbX3ZdIC0gMipkW3VdOwogICAgICAgIGRlbSArPSBnZXQocm9vdFtwb3NbdV1dLCByb290W3Bvc1t2XV0sMSwxZTUseSx5KTsKICAgICAgICBkZW0gPSBkZXB0aFtfdV0gKyBkZXB0aFtfdl0gLSAyKmRlcHRoW3VdIC0gZGVtOwogICAgICAgIGlmKGRlbSA8PSBrKXsKICAgICAgICAgICAgY291dCA8PCBzdW0gPDwgJ1xuJzsKICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgY291dCA8PCAtMSA8PCAnXG4nOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOwogICAgbmhhcCgpOwogICAgcHJvY2VzcygpOwp9Cg==