#include using namespace std; using ll = long long; #define rep(i, n) for(int i = 0; i < (int)(n); ++i) ll dijkstra(const auto &G) { int N = G.size(); vector d(N, 1e18); priority_queue, vector>, greater<>> que; d[0] = 0; que.push({d[0], 0}); while(!que.empty()) { auto [dv, v] = que.top(); que.pop(); if(dv != d[v]) continue; for(auto [nv, c] : G[v]) if(dv + c < d[nv]) { d[nv] = dv + c; que.push({d[nv], nv}); } } return d[N - 1]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, R; ll C; cin >> N >> R >> C; vector X(N), Y(N), Z(N), S(N); rep(i, N) cin >> X[i]; rep(i, N) cin >> Y[i]; rep(i, N) cin >> Z[i]; rep(i, N) cin >> S[i]; vector>> G(N * 6 + 7); auto add_edge = [&](int u1, int u2, int v1, int v2, ll c, bool f = 0) { const int u = N * u1 + u2, v = N * v1 + v2; G[u].push_back({v, c}); if(f) G[v].push_back({u, c}); }; rep(i, N) { rep(k, 2) { add_edge(3 * k + 0, i, 3 * k + 1, i, X[i]); add_edge(3 * k + 0, i, 3 * k + 2, i, Y[i]); add_edge(3 * k + 1, i, 3 * k + 2, i, Y[i]); } rep(k, 3) { add_edge(k, i, 3 + k, i, Z[i]); add_edge(3 + k, i, 6, k, S[i]); add_edge(6, 3 + k, 3 + k, i, S[i]); } } rep(k, 3) add_edge(6, k, 6, 3 + k, C); rep(k, 6) add_edge(k, N - 1, 6, 6, 0); while(R--) { int U, V, W, A, M; cin >> U >> V >> W >> A >> M, --U, --V; A = min(A, W), M = min(M, A); rep(k, 2) { add_edge(3 * k + 0, U, 3 * k + 0, V, W, 1); add_edge(3 * k + 1, U, 3 * k + 1, V, A, 1); add_edge(3 * k + 2, U, 3 * k + 2, V, M, 1); } } cout << dijkstra(G) << "\n"; }