#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include #include #define rep(i, a, b) for (ll i = (ll)(a); i < (ll)(b); i++) using namespace atcoder; using namespace std; typedef long long ll; template struct Graph { struct edge { int to; T cost; }; int n; vector> gr; vector dist; vector prev; T inf, zero; Graph(int n, T inf, T zero) : n(n), inf(inf), zero(zero) { init(n); } void init(int n_) { gr.assign(n, {}); dist.assign(n, inf); prev.assign(n, -1); } void add_edge(int from, int to, T cost) { gr[from].push_back({to, cost}); } void dijkstra(int s) { fill(dist.begin(), dist.end(), inf); fill(prev.begin(), prev.end(), -1); priority_queue, vector>, greater>> pq; dist[s] = zero; pq.push({zero, s}); while (!pq.empty()) { auto [d, v] = pq.top(); pq.pop(); if (dist[v] < d) continue; for (const auto& e : gr[v]) { T nd = d + e.cost; if (dist[e.to] > nd) { dist[e.to] = nd; prev[e.to] = v; pq.push({nd, e.to}); } } } } vector get_path(int t) const { if (dist[t] == inf) return {-1}; vector path; for (; t != -1; t = prev[t]) { path.push_back(t); } reverse(path.begin(), path.end()); return path; } }; void solve() { int n, c, m; cin >> n >> c >> m; vector u(m), v(m), x(m), y(m); rep(i, 0, m) cin >> u[i], u[i]--; rep(i, 0, m) cin >> v[i], v[i]--; rep(i, 0, m) cin >> x[i]; rep(i, 0, m) cin >> y[i]; int inf = 1e9 + 10; int block = c + 10; Graph gr(n * block, inf, 0); rep(i, 0, m) { for (int j = 0; j + x[i] <= c; j++) { gr.add_edge(u[i] * block + j, v[i] * block + j + x[i], y[i]); } } gr.dijkstra(0); int ans = inf; rep(i, 0, block) { ans = min(ans, gr.dist[(n - 1) * block + i]); } if (ans == inf) ans = -1; cout << ans << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); solve(); }