#include #include #include using namespace std; // SPFA 多分TLE struct Edge { int to; unsigned long long w; }; const unsigned long long INF = ~0ULL; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; if (!(cin >> N >> M)) return 0; vector> adj(N + 1); for (int i = 0; i < M; ++i) { int u, v; unsigned long long w; cin >> u >> v >> w; adj[u].push_back({v, w}); adj[v].push_back({u, w}); } vector A(N + 1), B(N + 1), C(N + 1); for (int i = 1; i <= N; ++i) cin >> A[i]; for (int i = 1; i <= N; ++i) cin >> B[i]; for (int i = 1; i <= N; ++i) cin >> C[i]; vector dist(N + 1, INF); queue q; dist[1] = 0; q.push(1); while (!q.empty()) { int u = q.front(); q.pop(); for (const auto& edge : adj[u]) { int v = edge.to; unsigned long long w = edge.w; unsigned long long k = (dist[u] + A[u] - 1) / A[u]; if (k < 1) k = 1; unsigned long long dept = k * A[u]; unsigned long long cost = w; if (k % B[u] == 0) { cost += C[u]; } unsigned long long arrival = dept + cost; if (arrival < dist[v]) { dist[v] = arrival; q.push(v); } } } cout << dist[N] << "\n"; return 0; }