#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define INF 1000000007 #define INF_MAX 2147483647 #define LL_MAX 9223372036854775807 #define EPS 1e-10 #define PI acos(-1) #define LL long long using namespace std; #define MAX_N 51 #define MAX_C 301 #define MAX_V 1501 int N, C, V; int S[MAX_V], T[MAX_V], Y[MAX_V], M[MAX_V]; int dp[MAX_N][MAX_C]; typedef pair II; typedef pair III; vector Edge[MAX_N]; int main(){ cin >> N >> C >> 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 < MAX_N; i++){ for(int j = 0; j < MAX_C; j++){ dp[i][j] = INF; } } for(int i = 0; i < V; i++){ Edge[S[i]].push_back(III(T[i], II(Y[i], M[i]))); } dp[1][0] = 0; for(int pos = 1; pos < N; pos++){ for(int c = 0; c <= C; c++){ for(int e = 0; e < Edge[pos].size(); e++){ III edge = Edge[pos][e]; int nextPos = edge.first; int nextCost = edge.second.first + c; int nextTime = edge.second.second; if(nextCost <= C){ dp[nextPos][nextCost] = min(dp[nextPos][nextCost], nextTime + dp[pos][c]); } } } } int ans = INF; for(int c = 0; c <= C; c++){ ans = min(ans, dp[N][c]); } if(ans == INF) cout << -1 << endl; else cout << ans << endl; return 0; }