#include using namespace std; #define rep(i, n) for(ll i = 0; i < ll(n); i++) using ll = long long; using P = pair; int main() { cin.tie(0); ios_base::sync_with_stdio(false); ll n, m; cin >> n >> m; vector a(m), b(m), c(m); rep(i, m) { cin >> a[i] >> b[i] >> c[i]; a[i]--, b[i]--; } vector t(n); rep(i, n) cin >> t[i]; vector> g(n); rep(i, m) { g[a[i]].push_back({b[i], c[i]}); g[b[i]].push_back({a[i], c[i]}); } const ll INF = 1e9; vector dist(n * (ll)2001, INF); priority_queue, greater

> que; dist[0 * (ll)2001 + t[0]] = t[0]; que.push({t[0], t[0]}); while (!que.empty()) { P now = que.top(); que.pop(); ll nv = now.second, nc = now.first; if(nc > dist[nv]) continue; for (auto elem : g[nv / (ll)2001]) { ll nnv = elem.first * (ll)2001 + min((ll)2000, nv % (ll)2001 + t[elem.first]); ll nnc = nc + elem.second / (nv % (ll)2001) + t[elem.first]; if (nnc < dist[nnv]) { dist[nnv] = nnc; que.push({nnc, nnv}); } } } ll ans = INF; rep(i, (ll)2001) { ans = min(ans, dist[(n - 1) * (ll)2001 + i]); } cout << ans << endl; return 0; }