#include #define fi first #define se second #define rep(i,s,n) for (int i = (s); i < (n); ++i) #define rrep(i,g,n) for (int i = (n)-1; i >= (g); --i) #define all(a) a.begin(),a.end() #define rall(a) a.rbegin(),a.rend() #define len(x) (int)(x).size() #define dup(x,y) (((x)+(y)-1)/(y)) #define pb push_back #define eb emplace_back #define Field(T) vector> using namespace std; using ll = long long; using ull = unsigned long long; template using pq = priority_queue,greater>; using P = pair; templatebool chmax(T&a,T b){if(abool chmin(T&a,T b){if(b> n >> m; vector p(n); rep(i,0,n) cin >> p[i]; vector u(m), v(m), t(m); rep(i,0,m) { cin >> u[i] >> v[i] >> t[i]; --u[i], --v[i]; } vector pt(n, 0); rep(j,0,n) { rep(i,0,m) { if (pt[v[i]] > pt[u[i]]+t[i]) { pt[v[i]] = pt[u[i]]+t[i]; } } } // rep(i,0,n) cout << pt[i] << " "; // cout << endl; vector>> G(n); rep(i,0,m) { G[u[i]].eb(v[i], pt[u[i]]+t[i]-pt[v[i]]); // cout << pt[u[i]]+t[i]-pt[v[i]] << endl; } pq> que; ll ans = inf; int cnt = 0; rep(s,0,n) { vector dist(n, inf); dist[s] = 0; que.emplace(0, s); while(!que.empty()) { ll c; int v; tie(c, v) = que.top(); que.pop(); if (dist[v] < c) continue; for (auto [nv, cost] : G[v]) { if (dist[nv] > dist[v]+cost) { dist[nv] = dist[v]+cost; que.emplace(dist[nv], nv); } } } rep(i,0,n) { if (i == s || dist[i] == inf) continue; ll val = dist[i]-pt[s]+pt[i]+p[s]+p[i]; if (ans > val) { ans = val, cnt = 1; } else if (ans == val) { ++cnt; } } } cout << ans << " " << cnt << endl; return 0; }