#include #include #include using namespace std; const long long INF = 1e18; // 十分に大きな値 int main() { // 入出力の高速化 ios_base::sync_with_stdio(false); cin.tie(NULL); int N, M; if (!(cin >> N >> M)) return 0; vector P(N + 1); for (int i = 1; i <= N; ++i) { cin >> P[i]; } // dist[i][j] : i から j への最短距離 vector> dist(N + 1, vector(N + 1, INF)); for (int i = 1; i <= N; ++i) { dist[i][i] = 0; } // 辺の入力を受け取る for (int i = 0; i < M; ++i) { int u, v; long long t; cin >> u >> v >> t; // 多重辺がある場合は最小のものを採用 dist[u][v] = min(dist[u][v], t); } // ワーシャルフロイド法 (O(N^3)) for (int k = 1; k <= N; ++k) { for (int i = 1; i <= N; ++i) { if (dist[i][k] == INF) continue; // 到達不可ならスキップ for (int j = 1; j <= N; ++j) { if (dist[k][j] == INF) continue; dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } long long min_cost = INF; long long count = 0; // 最小コストとそのペア数を計算 (O(N^2)) for (int i = 1; i <= N; ++i) { for (int j = 1; j <= N; ++j) { if (i == j) continue; // 異なるステーション間のみ if (dist[i][j] != INF) { long long cost = dist[i][j] + P[i] + P[j]; if (cost < min_cost) { min_cost = cost; count = 1; } else if (cost == min_cost) { count++; } } } } cout << min_cost << " " << count << "\n"; return 0; }