#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 boost::multiprecision; */ using namespace std; using ll = long long; using ull = unsigned long long; #define REP(i,a,b) for(ll i = a; i < b; ++i) #define PRI(s) std::cout << s << endl #define PRIF(v, n) printf("%."#n"f\n", (double)v) templatevoid mins(A& a, const B& b) { a = min(a, (A)b); }; templatevoid maxs(A& a, const B& b) { a = max(a, (A)b); }; struct node { vector link; vector dist; ll d = 1e18; bool done = false; }; struct edge { ll s; ll t; ll y; ll m; }; int main() { ll N, C, V; cin >> N >> C >> V; auto ind = [&](ll n, ll c) { return n * (C+1) + c; }; vectornod(N * (C+1)); vector ed(V); REP(i, 0, V) cin >> ed[i].s; REP(i, 0, V) cin >> ed[i].t; REP(i, 0, V) cin >> ed[i].y; REP(i, 0, V) cin >> ed[i].m; REP(i, 0, V) { REP(c, 0, C + 1) { if (c + ed[i].y > C) continue; nod[ind(ed[i].s - 1, c)].link.push_back(ind(ed[i].t - 1, c + ed[i].y)); nod[ind(ed[i].s - 1, c)].dist.push_back(ed[i].m); } } auto cmp = [](auto a, auto b) {return a.first > b.first; }; priority_queue, vector>, decltype(cmp)> q{ cmp }; nod[0].d = 0; q.push({ 0,0 }); while (!q.empty()) { auto p = q.top(); q.pop(); if (nod[p.second].done) continue; ll i = p.second; nod[i].done = true; REP(j, 0, nod[i].link.size()) { ll c = nod[i].link[j]; if (nod[c].done) continue; if (nod[c].d > nod[i].d + nod[i].dist[j]) { nod[c].d = nod[i].d + nod[i].dist[j]; q.push({ nod[c].d, c }); } } } ll ans = 1e18; REP(i, 0, C + 1) mins(ans, nod[ind(N - 1, i)].d); if (ans == (ll)1e18) PRI(-1); else PRI(ans); return 0; }