#include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 1000000000 using namespace std; typedef long long ll; const int MAXV = 1600; const int MAXN = 64, MAXC = 324; int N, C, V; int S[MAXV], T[MAXV], Y[MAXV], M[MAXV]; int dp[MAXN][MAXC]; struct edge{ int to; int cost; int time; edge() {} edge(int to, int cost, int time) : to(to), cost(cost), time(time) {} }; vector G[MAXN]; int main(void) { cin >> N; cin >> C; cin >> V; for (int i = 0; i < V; i++) { cin >> S[i]; } for (int i = 0; i < V; i++) { cin >> T[i]; } for (int i = 0; i < V; i++) { cin >> Y[i]; } for (int i = 0; i < V; i++) { cin >> M[i]; } for (int i = 0; i < V; i++) { G[S[i]].push_back(edge(T[i], Y[i], M[i])); } for (int i = 0; i < MAXN; i++) { for (int j = 0; j < MAXC; j++) { dp[i][j] = INF; } } dp[1][0] = 0; for (int i = 1; i <= N; i++) { for (int j = 0; j < G[i].size(); j++) { edge e = G[i][j]; for (int k = 0; k <= C; k++) { if (k + e.cost <= C) { dp[e.to][k+e.cost] = min(dp[e.to][k+e.cost], dp[i][k] + e.time); } } } } int ans = INF; for (int i = 0; i <= C; i++) { ans = min(ans, dp[N][i]); } if (ans >= INF) cout << -1 << endl; else cout << ans << endl; return 0; }