#include using namespace std; typedef struct{ int corrent, next, money, tim; }EDGE; EDGE edge[1500]; vector> root(51); int N, C, V; int dp[51][301]; int main(void){ cin >> N >> C >> V; for(int i = 0; i < V; ++i) cin >> edge[i].corrent; for(int i = 0; i < V; ++i) cin >> edge[i].next; for(int i = 0; i < V; ++i) cin >> edge[i].money; for(int i = 0; i < V; ++i) cin >> edge[i].tim; for(int i = 0; i < V; ++i) root[edge[i].corrent].push_back(edge[i]); for(int i = 0; i < 51; ++i) for(int j = 0; j < 301; ++j) dp[i][j] = INT_MAX; dp[1][0] = 0; for(int i = 1; i <= N; ++i){ for(int j = 0; j <= C; ++j){ if(dp[i][j] != INT_MAX){ for(int k = 0; k < root[i].size(); ++k){ int next = root[i][k].next; int money = root[i][k].money; int tim = root[i][k].tim; if(j + money <= C) dp[next][j + money] = min(dp[i][j] + tim, dp[next][j + money]); } } } } int result = INT_MAX; for(int i = 0; i <= C; ++i) result = min(result, dp[N][i]); if(result == INT_MAX) cout << -1 << endl; else cout << result << endl; return 0; }