#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using LL = long long; using LD = long double; #define ALL(v) begin(v), end(v) #define REP(i, n) for (LL i = 0; (i) < (LL)(n); ++(i)) #define REPR(i, n) for (LL i = (LL)(n)-1; (i) >= 0; --(i)) #define REP2(i, n, m) for (LL i = (LL)(n); (i) < (LL)(m); ++(i)) #define REP2R(i, n, m) for (LL i = (LL)(n)-1; (i) >= (LL)(m); --(i)) #define INF 1000000000 #define MAXV 55 #define MAXC 305 int V, C, E; int S[MAXV], T[MAXV], Y[MAXV], M[MAXV]; int DP[MAXV][MAXC]; int main() { cin >> V >> C >> E; REP(i, E) { cin >> S[i]; --S[i]; } REP(i, E) { cin >> T[i]; --T[i]; } REP(i, E) cin >> Y[i]; REP(i, E) cin >> M[i]; REP(i, MAXV) REP(j, MAXC) DP[i][j] = INF; using Data = tuple; priority_queue,greater> que; que.push({0, 0, C}); DP[0][C] = 0; while (!que.empty()) { auto [dis, now, coin] = que.top(); que.pop(); if (DP[now][coin] < dis) continue; REP(i, E) { if (S[i] != now) continue; if (Y[i] > coin) continue; if (DP[T[i]][coin - Y[i]] > dis + M[i]) { DP[T[i]][coin - Y[i]] = dis + M[i]; que.push({dis + M[i], T[i], coin - Y[i]}); } } } int ans = INF; REP(i, MAXC) ans = min(ans, DP[V-1][i]); cout << (ans == INF ? -1 : ans) << endl; return 0; }