#include using namespace std; #define FOR(i, b, e) for(int i = (b); i < (e); i++) #define PB push_back #define X first #define Y second #define TRAV(x, v) for(auto &x: v) typedef long long ll; typedef pair ii; typedef vector vi; constexpr int INF = 0x3f3f3f3f; const int N = 10040; vector G[N]; // gosc, waga, id void solve() { int n, m; cin >> n >> m; vi dt(n), color(n); FOR(i, 0, n) cin >> dt[i]; FOR(i, 0, m) { int a, b, c; cin >> a >> b >> c; G[a].PB({b, c}); G[b].PB({a, c}); } priority_queue, vector>, greater>> q; // waga, v, kolor vector dist(n); FOR(i, 0, n) color[i] = i, dist[i] = dt[i]; FOR(i, 0, n) q.push({dist[i], {i, color[i]}}); while(!q.empty()) { auto v = q.top(); q.pop(); if(v.X != dist[v.Y.X]) continue; TRAV(x, G[v.Y.X]) { ll ndist = v.X + x.Y; if(ndist < dist[x.X]) { dist[x.X] = ndist; color[x.X] = v.Y.Y; q.push({dist[x.X], {x.X, color[x.X]}}); } } } ll ans = 1ll * INF * INF; FOR(i, 0, n) if(color[i] != i) ans = min(ans, dist[i] + dt[i]); FOR(i, 0, n) TRAV(x, G[i]) if(color[i] != color[x.X]) { ans = min(ans, dist[i] + x.Y + dist[x.X]); } cout << ans << '\n'; } int main() { ios::sync_with_stdio(0); cin.tie(0); solve(); return 0; }