from heapq import heappush, heappop
inf = float('inf')


def dijkstra(s, g, N):
    # ゴールがない場合はg=-1とする。

    def cost(v, m):
        return v * N + m

    dist = [inf] * N
    mindist = [inf] * N
    seen = [False] * N
    Q = [cost(0, s)]
    while Q:
        c, m = divmod(heappop(Q), N)
        if seen[m]:
            continue
        seen[m] = True
        dist[m] = c
        if m == g:
            return dist

        #------heapをアップデートする。--------
        for u, C in G[m]:
            if seen[u]:
                continue
            newdist = dist[m] + C

            #------------------------------------
            if newdist >= mindist[u]:
                continue
            mindist[u] = newdist
            heappush(Q, cost(newdist, u))
    return dist

def f(n, m):
    return n * (mx + 1) + m

N, M = map(int, input().split())
mx = 1001
N *= mx + 1
G = [[] for i in range(N)]
A, B, C = [0] * M, [0] * M, [0] * M
for i in range(M):
    A[i], B[i], C[i] = map(int, input().split())
    A[i], B[i] = A[i] - 1, B[i] - 1
    
T = list(map(int, input().split()))
for i in range(M):
    for p in range(mx + 1):
        if p + T[A[i]]:
            G[f(A[i], p)].append((f(B[i], min(mx, p + T[A[i]])), C[i]//(p + T[A[i]]) + T[A[i]]))
        if p + T[B[i]]:
            G[f(B[i], p)].append((f(A[i], min(mx, p + T[B[i]])), C[i]//(p + T[B[i]]) + T[B[i]]))
        
D = dijkstra(f(0, 0), -1, N)
ans = inf
for i in range(mx + 1):
    ans = min(ans, D[f(N//(mx + 1) - 1, i)])
print(ans)