#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 using namespace std; using ll = long long; constexpr int INF = 1001001001; constexpr int mod = 1000000007; // constexpr int mod = 998244353; template inline bool chmax(T& x, T y){ if(x < y){ x = y; return true; } return false; } template inline bool chmin(T& x, T y){ if(x > y){ x = y; return true; } return false; } int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); int N, C, V; cin >> N >> C >> V; vector S(V), T(V), Y(V), M(V); for(int i = 0; i < V; ++i){ cin >> S[i]; --S[i]; } for(int i = 0; i < V; ++i){ cin >> T[i]; --T[i]; } for(int i = 0; i < V; ++i) cin >> Y[i]; for(int i = 0; i < V; ++i) cin >> M[i]; using edge = tuple; vector> g(N); for(int i = 0; i < V; ++i){ g[S[i]].emplace_back(T[i], Y[i], M[i]); } vector> dp(N, vector(C + 1, INF)); dp[0][0] = 0; priority_queue, greater> que; que.emplace(0, 0, 0); while(!que.empty()){ auto [d, from, m] = que.top(); que.pop(); if(d > dp[from][m]) continue; for(auto [to, fare, cost] : g[from]){ if(m + fare <= C && chmin(dp[to][m + fare], dp[from][m] + cost)){ que.emplace(dp[to][m + fare], to, m + fare); } } } int ans = INF; for(int i = 0; i <= C; ++i) chmin(ans, dp[N - 1][i]); if(ans == INF) ans = -1; cout << ans << endl; return 0; }