#include #include #include #include #include int main() { using namespace std; int n, c, v; cin >> n >> c >> v; vector s(v), t(v), y(v), m(v); for (auto &e : s) { cin >> e; } for (auto &e : t) { cin >> e; } for (auto &e : y) { cin >> e; } for (auto &e : m) { cin >> e; } vector>> g(n); for (int i = 0; i < v; i++) { g[s[i] - 1].emplace_back(t[i] - 1, y[i], m[i]); } constexpr int INF = 1e6; vector dp(n, vector(c + 1, INF)); dp[0][c] = 0; priority_queue< tuple, vector>, greater>> que; que.emplace(0, 0, c); while (!que.empty()) { auto [d, v, r] = que.top(); que.pop(); if (dp[v][r] < d) { continue; } for (auto [nv, nc, nd] : g[v]) { if (r < nc || dp[nv][r - nc] <= d + nd) { continue; } dp[nv][r - nc] = d + nd; que.emplace(d + nd, nv, r - nc); } } int ans = INF; for (int r = 0; r <= c; r++) { ans = min(ans, dp[n - 1][r]); } cout << (ans == INF ? -1 : ans) << endl; }