#include #define rep(i,n) for(int i = 0; i < (n); i++) using namespace std; typedef long long ll; // g <- pair < v , cost > template < class T > vector< T > dijkstra(vector>> &graph, int s) { T INF = numeric_limits< T >::max(); vector dist(graph.size(), INF); priority_queue, vector>, greater>> q; q.push({dist[s] = T(0), s}); while(!q.empty()){ auto [uc, ui] = q.top(); q.pop(); if(uc != dist[ui]) continue; for(auto [vi, vc] : graph[ui]) if(dist[vi] > uc + vc) q.push({dist[vi] = uc + vc, vi}); } return dist; } int main(){ cin.tie(0); ios::sync_with_stdio(0); int N,M; cin >> N >> M; vector> E(M); for(auto &[a, b, c] : E) cin >> a >> b >> c, a--, b--; vector T(N); rep(i,N) cin >> T[i]; int MAX_C = 1000; vector>> G(N * (MAX_C + 1)); auto h = [MAX_C](int v, int p) { return v * (MAX_C + 1) + p; }; for(auto &[a, b, c] : E) { for(int p = 0; p <= MAX_C; p++) { if(p + T[a] != 0) G[h(a, p)].push_back({h(b, min(MAX_C, p + T[a])), c / min(MAX_C, p + T[a]) + T[a]}); if(p + T[b] != 0) G[h(b, p)].push_back({h(a, min(MAX_C, p + T[b])), c / min(MAX_C, p + T[b]) + T[b]}); } } auto dist = dijkstra(G, h(0, 0)); int ans = numeric_limits::max(); for(int p = 0; p <= MAX_C; p++) ans = min(ans, dist[h(N - 1, p)]); cout << ans << endl; }