output_description: Print Q lines. The j-th line (1 \leq j \leq Q) should contain the answer to
  Query j.
  
  * * *
input_description: Input is given from Standard Input in the following format:
  
      
      
      N Q
      a_1 b_1 c_1 d_1
      :
      a_{N-1} b_{N-1} c_{N-1} d_{N-1}
      x_1 y_1 u_1 v_1
      :
      x_Q y_Q u_Q v_Q
attempt: import math
  from collections import defaultdict, Counter
  
  n, q = map(int, input().split())
  
  tree = defaultdict(lambda: defaultdict(list))
  
  for _ in range(n - 1):
      u, v, color, dist = map(int, input().split())
      tree[u][v] = [color, dist]
      tree[v][u] = [color, dist]
  
  distance = [-1] * (n + 1)
  distance[1] = 0
  colors = [0] * (n + 1)
  colors[1] = {}
  aux_colors = [0] * (n + 1)
  aux_colors[1] = {}
  
  clr_template = defaultdict(int)
  
  
  def add(color, color_dict, dist):
      c = Counter(color_dict)
      c[color] = c.get(color, 0) + dist
      return c
  
  
  def aux_add(color, color_dict):
      c = Counter(color_dict)
      c[color] = c.get(color, 0) + 1
      return c
  
  
  E = []
  depth = [0] * (n + 1)
  
  
  def dfs_eulerTour(src):
      global E, colors, distance
      E.append(src)
  
      for nxt in tree[src]:
          if distance[nxt] == -1:
              color, dist = tree[src][nxt]
              colors[nxt] = add(color, colors[src], dist)
              aux_colors[nxt] = aux_add(color, aux_colors[src])
              distance[nxt] = distance[src] + dist
              depth[nxt] = depth[src] + 1
              dfs_eulerTour(nxt)
              E.append(src)
  
  
  dfs_eulerTour(1)
  # print(E)
  # print(colors)
  # print(depth)
  
  D = [depth[x] for x in E]
  N = len(D)
  
  
  def get_H():
      H = [-1] * (n + 1)
      vis_set = set()
      for i in range(N):
          if not E[i] in vis_set:
              vis_set.add(E[i])
              H[E[i]] = i
      return H
  
  
  H = get_H()
  
  M = [[0] * (int(math.log2(N)) + 1) for i in range(N + 1)]
  
  
  def preprocess(M, N, D):
      for i in range(N):
          M[i][0] = i
  
      for j in range(1, int(math.log2(N)) + 1):
          i = 0
          while i + (1 << j) - 1 < N:
              M[i][j] = (
                  M[i][j - 1]
                  if D[M[i][j - 1]] <= D[M[i + (1 << (j - 1))][j - 1]]
                  else M[i + (1 << (j - 1))][j - 1]
              )
              i += 1
  
  
  preprocess(M, N, D)
  
  
  def RMQ(i, j):
      k = int(math.log2(j - i))
      return M[i][k] if D[M[i][k]] <= D[M[j - (1 << k)][k]] else M[j - (1 << k)][k]
  
  
  def LCA(u, v):
      if u == v:
          return u
      elif H[u] > H[v]:
          u, v = v, u
          q = RMQ(H[u], H[v])
          return E[q]
      else:
          q = RMQ(H[u], H[v])
          return E[q]
  
  
  def get_colors(u, v, lca):
      cu = Counter(colors[u])
      cv = Counter(colors[v])
      clca = Counter(colors[lca])
      ac_u = Counter(aux_colors[u])
      ac_v = Counter(aux_colors[v])
      ac_lca = Counter(aux_colors[lca])
      return ac_u + ac_v - ac_lca - ac_lca, cu + cv - clca - clca
  
  
  for _ in range(q):
      color, dist, u, v = map(int, input().split())
      lca = LCA(u, v)
      net_dist = distance[u] + distance[v] - 2 * distance[lca]
      count_clrs, clrs = get_colors(u, v, lca)
      net_dist += count_clrs.get(color, 0) * dist - clrs.get(color, 0)
      print(net_dist)
  
problem_description: Statement
  
  There is a tree with N vertices numbered 1 to N. The i-th edge in this tree
  connects Vertex a_i and Vertex b_i, and the color and length of that edge are
  c_i and d_i, respectively. Here the color of each edge is represented by an
  integer between 1 and N-1 (inclusive). The same integer corresponds to the
  same color, and different integers correspond to different colors.
  
  Answer the following Q queries:
  
    * Query j (1 \leq j \leq Q): assuming that the length of every edge whose color is x_j is changed to y_j, find the distance between Vertex u_j and Vertex v_j. (The changes of the lengths of edges do not affect the subsequent queries.)
samples: [{"input": "5 3\n    1 2 1 10\n    1 3 2 20\n    2 4 4 30\n    5 2 1 40\n    1 100 1 4\n    1 100 1 5\n    3 1000 3 4", "output": "130\n    200\n    60\n    \n\nThe graph in this input is as follows:\n\n![Figure](https://img.atcoder.jp/ghi/ca75688b08f73eb63a30ce6daa54a781.png)\n\nHere the edges of Color 1 are shown as solid red lines, the edge of Color 2 is\nshown as a bold green line, and the edge of Color 4 is shown as a blue dashed\nline.\n\n  * Query 1: Assuming that the length of every edge whose color is 1 is changed to 100, the distance between Vertex 1 and Vertex 4 is 100 + 30 = 130.\n  * Query 2: Assuming that the length of every edge whose color is 1 is changed to 100, the distance between Vertex 1 and Vertex 5 is 100 + 100 = 200.\n  * Query 3: Assuming that the length of every edge whose color is 3 is changed to 1000 (there is no such edge), the distance between Vertex 3 and Vertex 4 is 20 + 10 + 30 = 60. Note that the edges of Color 1 now have their original lengths."}]