import heapq def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 M = int(input[ptr]) ptr += 1 X = int(input[ptr]) ptr += 1 edges = [[] for _ in range(N)] max_b = 0 for _ in range(M): u = int(input[ptr]) - 1 ptr += 1 v = int(input[ptr]) - 1 ptr += 1 a = int(input[ptr]) ptr += 1 b = int(input[ptr]) ptr += 1 edges[u].append((v, a, b)) edges[v].append((u, a, b)) if b > max_b: max_b = b low = 0 high = max_b + 1 ans = -1 inf = 1 << 60 while low < high: mid = (low + high) // 2 dist = [inf] * N dist[0] = 0 heap = [(0, 0)] found = False possible = False while heap: d, u = heapq.heappop(heap) if u == N - 1: found = True possible = (d <= X) break if d > dist[u]: continue for (v, a, b) in edges[u]: if b >= mid: new_d = d + a if new_d < dist[v]: dist[v] = new_d heapq.heappush(heap, (new_d, v)) if not found: possible = False else: possible = possible or (dist[N-1] <= X) if possible: ans = mid low = mid + 1 else: high = mid print(ans if ans != -1 else -1) if __name__ == '__main__': main()