import sys import heapq sys.setrecursionlimit(10 ** 6) # ===== 入出力ヘルパ ===== def input() -> str: return sys.stdin.readline().rstrip() def INT() -> int: return int(input()) def MAP(): return map(int, input().split()) def LIST() -> list[int]: return list(MAP()) # ===== 定数 ===== INF = 10 ** 18 # ===== 関数短縮 ===== hepu = heapq.heappush hepo = heapq.heappop # ============================================== # =================== main ===================== # ============================================== def main() -> None: N, M = MAP() P = LIST() edges = [] for _ in range(M): u, v, t = MAP() edges.append((u-1, v-1, t)) # BF h = [0] * N for _ in range(N): up = False for u, v, t in edges: if h[u] + t < h[v]: h[v] = h[u] + t up = True if not up: break # グラフ更新 G_prime = [[] for _ in range(N)] for u, v, t in edges: w_prime = t + h[u] - h[v] G_prime[u].append((v, w_prime)) # answer前準備 (定数倍高速化1/2) base = [P[i] - h[i] for i in range(N)] P_plus_h = [P[i] + h[i] for i in range(N)] min_cost = INF min_count = 0 # 全頂点Dijkstra法とコスト計算 for i in range(N): dist = [INF] * N dist[i] = 0 h = [(0, i)] while h: d, v = hepo(h) if d > dist[v]: continue for to, wp in G_prime[v]: nxt_dist = d + wp if nxt_dist < dist[to]: dist[to] = nxt_dist hepu(h, (nxt_dist, to)) for j in range(N): if i == j or dist[j] == INF: continue cost = dist[j] + base[i] + P_plus_h[j] if cost < min_cost: min_cost = cost min_count = 1 elif cost == min_cost: min_count += 1 print(min_cost, min_count) if __name__ == "__main__": main()