#define _USE_MATH_DEFINES #include using namespace std; using ul = unsigned long long; using ll = long long; using ld = long double; using pll = pair; #define in(v,c) ((c).find(v) != (c).end()) #define F(i,n) for(ll i = 0; i < (n); i++) #define Fun(i,n) for(ul i = 0; i < (n); i++) #ifdef GPD templatevoid lerr(F&&f){cerr<(f)<void lerr(F&&f,R&&...r){cerr<(f)<<' ';lerr(forward(r)...);} #else #define lerr(...) #endif struct Node { unordered_map nbs; ll nw; bool vis = false; ll visStart; ll visDist; }; ll n, m; vector nodes; typedef tuple T; int main(int argc, char const *argv[]) { cin.tie(0)->sync_with_stdio(0); cin.exceptions(cin.failbit); cout << setprecision(9) << fixed; lerr("ready"); cin >> n >> m; nodes.resize(n); F(i, n) cin >> nodes[i].nw; F(i, m) { ll a, b, w; cin >> a >> b >> w; nodes[a].nbs[b] = w; nodes[b].nbs[a] = w; } priority_queue, greater> q; // dist, vi, start F(i, n) q.push(make_tuple(nodes[i].nw, i, i)); ll minv = LLONG_MAX; while(!q.empty()) { ll dist, vi, start; tie(dist, vi, start) = q.top(); q.pop(); auto & v = nodes[vi]; if(v.vis) { if(v.visStart != start) { minv = min(minv, v.visDist+dist); // cout << v.visDist + dist << endl; // return 0; } continue; } v.vis = true; v.visStart = start; v.visDist = dist; for(auto& it : v.nbs) { q.push(make_tuple(dist+it.second, it.first, start)); } } if(minv == LLONG_MAX) cout << 0 << endl; else cout << minv << endl; return 0; }