#include #include using namespace std; #define INF 99999999 struct edge{int from,to,cost,time;}; int main(){ int ans = 0,n,c,v; cin >> n >> c >> v; edge e[v]; for(int i = 0;i < v;i++) cin >> e[i].from; for(int i = 0;i < v;i++) cin >> e[i].to; for(int i = 0;i < v;i++){ e[i].from--; e[i].to--; } for(int i = 0;i < v;i++) cin >> e[i].cost; for(int i = 0;i < v;i++) cin >> e[i].time; int timedp[n],costdp[n],prev[n]; fill(timedp,timedp + n,INF); fill(costdp,costdp + n,INF); fill(prev,prev + n,-1); timedp[0] = costdp[0] = 0; for(int i = 1;i < n;i++){ for(int j = 0;j < v;j++){ if(e[j].to == i && timedp[i] >= timedp[e[j].from] + e[j].time && costdp[e[j].from] + e[j].cost <= c){ timedp[i] = timedp[e[j].from] + e[j].time; costdp[i] = costdp[e[j].from] + e[j].cost; prev[i] = j; } } } if(timedp[n - 1] == INF){ cout << -1 << endl; return 0; } for(int i = n - 1;i != 0;i = e[prev[i]].from) ans += e[prev[i]].time; cout << ans << endl; }