#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--; } 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 < 5 * 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'; }