#include #include #include #include using namespace std; using int64 = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N, M; cin >> N >> M; vector P(N); for (int i = 0; i < N; ++i) { cin >> P[i]; } // 加算時のオーバーフローを避けるため、 // long long の最大値より十分小さい値を使う。 const int64 INF = numeric_limits::max() / 4; vector> dist(N, vector(N, INF)); for (int i = 0; i < N; ++i) { dist[i][i] = 0; } for (int i = 0; i < M; ++i) { int u, v; int64 t; cin >> u >> v >> t; --u; --v; // 同じ頂点間に複数のゲートがある場合に対応 dist[u][v] = min(dist[u][v], t); } // ワーシャル・フロイド法 for (int k = 0; k < N; ++k) { for (int i = 0; i < N; ++i) { if (dist[i][k] == INF) { continue; } for (int j = 0; j < N; ++j) { if (dist[k][j] == INF) { continue; } dist[i][j] = min( dist[i][j], dist[i][k] + dist[k][j] ); } } } int64 minimumCost = INF; int64 countPairs = 0; // (A, B) は順序付きペアとして数える for (int A = 0; A < N; ++A) { for (int B = 0; B < N; ++B) { if (A == B || dist[A][B] == INF) { continue; } int64 cost = dist[A][B] + P[A] + P[B]; if (cost < minimumCost) { minimumCost = cost; countPairs = 1; } else if (cost == minimumCost) { ++countPairs; } } } cout << minimumCost << ' ' << countPairs << '\n'; return 0; }