// warm heart, wagging tail,and a smile just for you!
//                                                                     ███████████
//                                                                   ███╬╬╬╬╬╬╬╬╬╬███
//                                                                ███╬╬╬╬╬████╬╬╬╬╬╬███
//                                            ███████████       ██╬╬╬╬╬████╬╬████╬╬╬╬╬██
//                                      █████████╬╬╬╬╬████████████╬╬╬╬╬██╬╬╬╬╬╬███╬╬╬╬╬██
//                               ████████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬██╬╬╬╬╬╬╬██
//                             ████╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████████╬╬╬╬╬╬╬╬╬╬╬██
//                           ███╬╬╬█╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬███╬╬╬╬╬╬╬█████
//                         ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬████████╬╬╬╬╬██
//                       ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬╬╬╬╬███
//                     ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬██
//                 ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬████
//     █████████████╬╬╬╬╬╬╬╬██╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬██████
//   ████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬██████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████╬╬╬╬╬╬╬███████████╬╬╬╬╬╬╬╬██╬╬╬██╬╬╬██
// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████╬╬╬╬╬╬╬╬╬╬╬█╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬██
// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬▓▓▓▓▓▓╬╬╬████╬╬████╬╬╬╬╬╬╬▓▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬███
// ██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██████▓▓▓▓▓▓▓╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬▓▓▓▓▓▓▓██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██╬╬╬╬█████
// ███╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████████
//   ███╬╬╬╬╬╬╬╬╬╬╬╬╬█████╬╬╬╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬███╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬██
//       ██████████████  ████╬╬╬╬╬╬███████████████████████████╬╬╬╬╬██╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬╬████
//                         ███████                           █████  ███████████████████
#include "bits/stdc++.h"
using namespace std;
#define MOD 1000000007
//#define MOD 998244353
const double EPS = 1e-9;
#define INF (1LL<<60)
#define D double
#define fs first
#define sc second
#define int long long
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define RFOR(i,a,b) for(int i = (b-1);i>=(a);--i)
#define REP(i,n)  FOR(i,0,(n))
#define RREP(i,n) RFOR(i,0,(n))
#define ITR(itr,mp) for(auto itr = (mp).begin(); itr != (mp).end(); ++itr)
#define RITR(itr,mp) for(auto itr = (mp).rbegin(); itr != (mp).rend(); ++itr)
#define range(i,a,b) ((a)<=(i) && (i)<(b))
#define debug(x)  cout << #x << " = " << (x) << endl;
#define SP << " " << 
typedef pair<int,int> P;
typedef vector<int> vec;
typedef vector<vector<int>> mat;

const int N = 1e5+10;
vector<int> edge[N],dist(N);
int MAX_LOG_V = log2(N)+1;
mat par(MAX_LOG_V,vec(N+1));

void dfs(int no,int p,int d){
  par[0][no]=p;
  dist[no]=d;
  for(auto to:edge[no]){
    if(to!=p) dfs(to,no,d+1);
  }
}

void init(int V, int root){
  dfs(root,-1,0); //root,parent,dist
  for(int k=0;k+1<MAX_LOG_V;++k){
    for(int v=0;v<V;v++){
      if(par[k][v]<0) par[k+1][v]=-1;
      else par[k+1][v]=par[k][par[k][v]];
    }
  }
}

int lca(int u,int v){
  if(dist[u]>dist[v]) swap(u,v);
  for(int k=0;k<MAX_LOG_V;++k){
    if((dist[v]-dist[u])>>k&1){
      v=par[k][v];
    }
  }
  if(u==v) return u;
  for(int k=MAX_LOG_V-1;k>=0;--k){
    if(par[k][u]!=par[k][v]){
      u=par[k][u];
      v=par[k][v];
    }
  }
  return par[0][u];
}

map<int,int> sum[N],cnt[N];

struct E{
  int to,col,cost;
  E(int a, int b, int c):to(a),col(b),cost(c){}
};

vector<int> used(N,0),num(N,0),total(N,0),color[N],cost(N,0);
vector<E> edge2[N];
void dfs2(int no, int dist){
  used[no]++;
  cost[no] = dist;
  for(int c:color[no]){
    sum[no][c] = total[c];
    cnt[no][c] = num[c];
  }
  for(E e:edge2[no]){
    if(used[e.to]) continue;
    num[e.col]++;
    total[e.col] += e.cost;
    dfs2(e.to,dist+e.cost);
    num[e.col]--;
    total[e.col] -= e.cost;
  }
}

signed main(){
  ios::sync_with_stdio(false);
  cin.tie(0);

  int n,q;
  cin >> n >> q;

  REP(_,n-1){
    int a,b,c,d;
    cin >> a >> b >> c >> d;
    a--; b--; c--;
    edge[a].emplace_back(b);
    edge[b].emplace_back(a);

    edge2[a].emplace_back(E(b,c,d));
    edge2[b].emplace_back(E(a,c,d));
  }

  init(n,0);

  vec x(q),y(q),u(q),v(q),l(q);
  REP(i,q){
    cin >> x[i] >> y[i] >> u[i] >> v[i];
    x[i]--; u[i]--; v[i]--;
    l[i] = lca(u[i],v[i]);
    color[u[i]].emplace_back(x[i]);
    color[v[i]].emplace_back(x[i]);
    color[l[i]].emplace_back(x[i]);
  }

  dfs2(0,0);

  REP(i,q){
    int a = cost[u[i]]-sum[u[i]][x[i]]+cnt[u[i]][x[i]]*y[i];
    int b = cost[v[i]]-sum[v[i]][x[i]]+cnt[v[i]][x[i]]*y[i];
    int c = cost[l[i]]-sum[l[i]][x[i]]+cnt[l[i]][x[i]]*y[i];
    //cout << a SP b SP c << endl;
    cout << a+b-2*c << '\n';
  }

  return 0;
}

Measured memory_bytes: 86384