#include using namespace std; using ll = long long; template istream& operator >> (istream& is, vector& vec) { for(T& x : vec) is >> x; return is; } template ostream& operator << (ostream& os, const vector& vec) { if(vec.empty()) return os; os << vec[0]; for(auto it = vec.begin(); ++it != vec.end(); ) os << ' ' << *it; return os; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n >> m; vector p(n); for(auto &&v : p) cin >> v; vector> E(m); for(auto &&[u, v, w] : E){ cin >> u >> v >> w; u--, v--; } if(n <= 800){ vector> dp(n, vector(n, 1ll << 60)); for(auto [u, v, w] : E) dp[u][v] = min(dp[u][v], (ll)w); for(int k = 0; k < n; k++){ for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ dp[i][j] = min(dp[i][j], dp[i][k] + dp[k][j]); } } } ll mn = 1ll << 60; int ans = 0; for(int i = 0; i < n; i++){ for(int j = 0; j < n; j++){ if(i == j) continue; ll v = dp[i][j] + p[i] + p[j]; if(v < mn){ mn = v; ans = 1; }else if(v == mn) ans++; } } cout << mn << " " << ans << '\n'; return 0; } ll mn = 1ll << 60; vector dp(n); constexpr int BL = 2500; vector> dp2(n); for(int i = 0; i < n; i++){ dp[i] = p[i]; dp2[i][i] = 1; } vector ndp(n, 1ll << 60); vector> ndp2(n); for(auto [u, v, w] : E){ if(dp[u] + w < ndp[v]){ ndp[v] = dp[u] + w; ndp2[v].reset(); } if(dp[u] + w == ndp[v]) ndp2[v] |= dp2[u]; } swap(dp, ndp); swap(dp2, ndp2); for(int i = 0; i < n; i++){ for(auto [u, v, w] : E){ if(dp[u] + w < dp[v]){ dp[v] = dp[u] + w; dp2[v].reset(); } if(dp[u] + w == dp[v]) dp2[v] |= dp2[u]; } } for(int i = 0; i < n; i++) mn = min(mn, dp[i] + p[i]); int ans = 0; for(int i = 0; i < n; i++){ if(mn != dp[i] + p[i]) continue; ans += dp2[i].count(); } cout << mn << " " << ans << '\n'; }