n, m = list(map(int, input().split())) A = list(map(int, input().split())) inf = 1<<60 node = [[] for _ in range(n+1)] for _ in range(m): u, v, w = list(map(lambda x: int(x)-1, input().split())) node[u].append((v, w+1)) for i in range(n): node[n].append((i, 0)) D = [inf] * (n+1) D[n] = 0 f = 0 for _ in range(n+2): for u in range(n+1): for v, w in node[u]: if D[v] > D[u]+w: D[v] = D[u]+w f = 1 if not f: break node_ = [[] for _ in range(n)] for u in range(n): for v, w in node[u]: node_[u].append((v, D[u]-D[v]+w)) a0, a1 = inf, 0 from heapq import * for s in range(n): hq = [] heappush(hq, (0, s)) DD = [inf] * n DD[s] = 0 while hq: cost, u = heappop(hq) if DD[u] < cost: continue for v, w in node_[u]: if DD[v] > cost+w: DD[v] = cost+w heappush(hq, (cost+w, v)) for t in range(n): if s == t: continue d = DD[t]+A[s]+A[t]+D[t]-D[s] if d < a0: a0, a1 = d, 1 elif d == a0: a1 += 1 print(a0, a1)