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 sys
  import math
  from collections import defaultdict
  
  input = sys.stdin.readline
  N, Q = map(int, input().split())
  abcd = [list(map(int, input().split())) for _ in range(N - 1)]
  
  g = [[] for _ in range(N)]
  for a, b, c, d in abcd:
      g[a - 1].append((b - 1, c, d))
      g[b - 1].append((a - 1, c, d))
  
  children = [[] for _ in range(N)]
  parents = [[] for _ in range(N)]  # 先祖(自分を含む)
  distance = [math.inf] * N  # rootへの距離
  distance_by_color = [
      defaultdict(lambda: (0, 0)) for _ in range(N)
  ]  # rootへの色ごとの(辺の数, 距離)
  # nodeid, parents, dist, dist_by_color
  q = [(0, [0], 0, defaultdict(lambda: (0, 0)))]
  while len(q) > 0:
      v, p, dist, dist_c = q.pop()
      parents[v] = p
      distance[v] = dist
      distance_by_color[v] = dist_c
      for u, c, d in g[v]:
          p__ = p[-2] if len(p) >= 2 else None
          if u != p__:
              dist_c_ = dist_c.copy()
              dist_c_[c] = (dist_c_[c][0] + 1, dist_c_[c][1] + d)
              p_ = p + [u]
              q.append((u, p_, dist + d, dist_c_))
              children[v].append(u)
  
  
  def is_ok(mid, parents1, parents2):
      try:
          return parents1[mid] == parents2[mid]
      except IndexError:
          return False
  
  
  def lca(parents1, parents2):
      ng = min(len(parents1), len(parents2)) + 1
      ok = 0
      while abs(ok - ng) > 1:
          mid = (ok + ng) // 2
          if is_ok(mid, parents1, parents2):
              ok = mid
          else:
              ng = mid
      return ok
  
  
  def color_diff(edges_info, y):
      return edges_info[0] * y - edges_info[1]
  
  
  for _ in range(Q):
      x, y, u, v = map(int, input().split())
      u -= 1
      v -= 1
      ans = 0
      p = lca(parents[u], parents[v])
      ans += distance[u]
      ans += distance[v]
      ans -= 2 * distance[p]
      ans += color_diff(distance_by_color[u][x], y)
      ans += color_diff(distance_by_color[v][x], y)
      ans -= 2 * color_diff(distance_by_color[p][x], y)
      print(ans)
  
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."}]