#ifndef _GLIBCXX_NO_ASSERT #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #include #include #include #include #include #include #include #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #if __cplusplus >= 201103L #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif using namespace std; using i64 = int64_t; using vi = vector; using vvi = vector; constexpr i64 MOD = 1000000000; struct edge { int from, to, cost, time; }; int main() { int n, c, v; cin >> n >> c >> v; vector edges(v); for (int i = 0; i < v; i++) { int s; cin >> s; s--; edges[i].from = s; } for (int i = 0; i < v; i++) { int s; cin >> s; s--; edges[i].to = s; } for (int i = 0; i < v; i++) { int s; cin >> s; edges[i].cost = s; } for (int i = 0; i < v; i++) { int s; cin >> s; edges[i].time = s; } const int INF = 1e9; vvi dp(n, vi(c + 1, INF)); // dp[i][j][k]: 街iにj円の状態でたどり着く最短時間 dp[0][c] = 0; for (int i = 0; i < n; i++) { for (int k = 0; k <= c; k++) { for (edge& e: edges) { if (e.from == i && e.cost <= k) { dp[e.to][k - e.cost] = min(dp[e.to][k - e.cost], dp[e.from][k] + e.time); } } } } i64 ans = 1e9; for (int i = 0; i <= c; i++) { ans = min(ans, dp[n - 1][i]); } cout << (ans == 1e9 ? -1 : ans) << endl; }