module main; import std; // https://algo-logic.info/dijkstra/ より struct Edge { int to, cost, time; } int N, C, V; int[] S, T, Y, M; Edge[][] G; int[] t; immutable INF = int.max / 2; // ダイクストラ法 alias P = Tuple!(int, int, int); // 仮の最短時間、頂点、かかったコストの組 void dijkstra(int s) { t[] = INF; t[s] = 0; auto que = new RedBlackTree!(P, (a, b) => a[0] < b[0] || (a[0] == b[0] && a[1] < b[1]))(P(0, s, 0)); while (!que.empty) { P p = que.front; que.removeFront; int v = p[1]; // 最短時間でなければ無視 if (t[v] < p[0]) continue; foreach (e; G[v]) { if (t[e.to] <= t[v] + e.time || p[2] + e.cost > C) continue; t[e.to] = t[v] + e.time; que.insert(P(t[e.to], e.to, p[2] + e.cost)); } } } void main() { // 入力 N = readln.chomp.to!int; C = readln.chomp.to!int; V = readln.chomp.to!int; S = readln.split.to!(int[]); T = readln.split.to!(int[]); Y = readln.split.to!(int[]); M = readln.split.to!(int[]); t = new int[](N + 1); G = new Edge[][](N + 1); foreach (i; 0 .. V) { G[S[i]] ~= Edge(T[i], Y[i], M[i]); } // 答えの計算 dijkstra(1); // 答えの出力 writeln(t[N] == INF ? -1 : t[N]); }