#include using namespace std; using ll = long long; #ifdef LOCAL #include #else #define debug(...) #endif constexpr int INF = (1 << 30) - 1; int main() { cin.tie(nullptr); ios::sync_with_stdio(false); cout << fixed << setprecision(20); int N, C, M; cin >> N >> C >> M; vector S(M), T(M), Y(M), W(M); for (int i = 0; i < M; i++) cin >> S[i], S[i]--; for (int i = 0; i < M; i++) cin >> T[i], T[i]--; for (int i = 0; i < M; i++) cin >> Y[i]; for (int i = 0; i < M; i++) cin >> W[i]; vector>> G(N); for (int i = 0; i < M; i++) { // Y[i]: cost, W[i]: time G[S[i]].emplace_back(T[i], Y[i], W[i]); } // dp[c][i] := コスト c で頂点 i に到達するまでの最短時間 vector dp(C + 1, vector(N, INF)); dp[0][0] = 0; for (int c = 0; c < C; c++) { for (int i = 0; i < N; i++) { if (dp[c][i] == INF) continue; for (auto [j, y, w] : G[i]) { if (c + y <= C) { dp[c + y][j] = min(dp[c + y][j], dp[c][i] + w); } } } } int ans = INF; for (int c = 0; c <= C; c++) ans = min(ans, dp[c][N - 1]); cout << (ans == INF ? -1 : ans) << "\n"; }