from heapq import heappush, heappop from sys import stdin input = stdin.readline inf = 1 << 60 def main(): n, m = map(int, input().split()) edges = [[] for _ in range(n)] for _ in range(m): u, v, c, d = map(int, input().split()) edges[u-1].append([v-1, c, d]) edges[v-1].append([u-1, c, d]) for i in range(n): edges[i].sort(key=lambda x: x[0]) # dijkstra dist = [inf] * n dist[0] = 0 prev = [-1] * n heap = [] heappush(heap, (0, 0)) while heap: cost, u = heappop(heap) if u == n-1: break if dist[u] < cost: continue for v, c, d in edges[u]: if cost + c < dist[v]: dist[v] = cost + c prev[v] = u heappush(heap, (cost+c, v)) dist1 = dist[n-1] def binary_search(u, v): left = 0 right = len(edges[u]) - 1 while left < right: center = (left + right) // 2 if edges[u][center][0] < v: left = center + 1 else: right = center edges[u][left][1], edges[u][left][2] = edges[u][left][2], edges[u][left][1] u = n-1 while u > 0: v = prev[u] binary_search(u, v) binary_search(v, u) u = v # dijkstra dist = [inf] * n dist[0] = 0 heap = [] heappush(heap, (0, 0)) while heap: cost, u = heappop(heap) if u == n-1: break if dist[u] < cost: continue for v, c, d in edges[u]: if cost + c < dist[v]: dist[v] = cost + c heappush(heap, (cost+c, v)) print(dist1 + dist[n-1]) main()