#include #include #include #include using namespace std; using ll = long long; using P = pair; using tu = tuple; int main(void){ int n, m; cin >> n >> m; vector p(n); for(auto&x:p) cin >> x; vector> to(n+1); vector edge; for(int i=0; i> u >> v >> t; u--, v--; edge.emplace_back(u, v, t); to[u].emplace_back(v, t); } for(int i=0; i po(n+1, 1e18); po[n]=0; for(int i=0; ind){ po[v]=nd; update=true; } } if(!update) break; } vector dist(n+1, vector(n+1, 1e18)); auto dij=[&](int st){ priority_queue, greater

> pri; pri.emplace(0, st); dist[st][st]=0; while(pri.size()){ auto [d, id]=pri.top(); pri.pop(); if(dist[st][id]!=d) continue; for(auto [v, w]:to[id]){ ll nd=d+w+po[id]-po[v]; if(dist[st][v]>nd){ dist[st][v]=nd; pri.emplace(nd, v); } } } }; for(int i=0; i<=n; i++) dij(i); ll mi=1e18, ans=0; for(int i=0; i=now){ if(mi>now) ans=1; else ans++; mi=now; } } if(mi==1e18) cout << -1 << endl; else cout << mi << ' ' << ans << endl; return 0; }