#include using namespace std; typedef long long ll; templatebool chmax(T &a, const T &b) { if (abool chmin(T &a, const T &b) { if (b> { // (for doubles, use inf = 1/.0, div(a,b) = a/b) static const ll inf = LLONG_MAX; ll div(ll a, ll b) { // floored division return a / b - ((a ^ b) < 0 && a % b); } bool isect(iterator x, iterator y) { if (y == end()) return x->p = inf, 0; if (x->k == y->k) x->p = x->m > y->m ? inf : -inf; else x->p = div(y->m - x->m, x->k - y->k); return x->p >= y->p; } void add(ll k, ll m) { k*=-1;m*=-1; auto z = insert({k, m, 0}), y = z++, x = y; while (isect(y, z)) z = erase(z); if (x != begin() && isect(--x, y)) isect(x, y = erase(y)); while ((y = x) != begin() && (--x)->p >= y->p) isect(x, erase(y)); } ll query(ll x) { assert(!empty()); auto l = *lower_bound(x); return -(l.k * x + l.m); } }; ll dis1[MAX],dis2[MAX]; vector> G[MAX]; int main(){ std::ifstream in("text.txt"); std::cin.rdbuf(in.rdbuf()); cin.tie(0); ios::sync_with_stdio(false); ll N,M;cin>>N>>M; vector W(N); for(int i=0;i>W[i]; for(int i=0;i>a>>b>>c;a--;b--; G[a].push_back(mp(b,c)); G[b].push_back(mp(a,c)); } for(int i=0;i,vector>,greater>> PQ; PQ.push(mp(0,0)); while(!PQ.empty()){ auto [d,u]=PQ.top();PQ.pop(); if(dis1[u],vector>,greater>> PQ; PQ.push(mp(0,N-1)); while(!PQ.empty()){ auto [d,u]=PQ.top();PQ.pop(); if(dis2[u]