struct Edge property target : Int32 property cost : Int32 property time : Int32 def initialize(@target, @cost, @time) end end n, c, v = read_line.split.map(&.to_i) s = Array.new(v, 0) t = Array.new(v, 0) y = Array.new(v, 0) m = Array.new(v, 0) v.times do |i| s[i] = read_line.to_i - 1 end v.times do |i| t[i] = read_line.to_i - 1 end v.times do |i| y[i] = read_line.to_i end v.times do |i| m[i] = read_line.to_i end # Build adjacency list graph = Array(Array(Edge)).new(n) { [] of Edge } v.times do |i| graph[s[i]] << Edge.new(t[i], y[i], m[i]) end # Priority queues for each node (cost, time) vq = Array(Set({Int32, Int32})).new(n) { Set({Int32, Int32}).new } vq[0] << {0, 0} n.times do |i| min_time = Int32::MAX vq[i].each do |(cost, time)| next if min_time <= time min_time = time graph[i].each do |edge| new_cost = cost + edge.cost new_time = time + edge.time if new_cost <= c vq[edge.target] << {new_cost, new_time} end end end end minv = Int32::MAX vq[n - 1].each do |(cost, time)| minv = Math.min(minv, time) end minv = -1 if minv == Int32::MAX puts minv