ワーシャル・フロイド法

E - 全点対最短経路問題

O(N3)

import sys
import math
import heapq
import itertools
from collections import deque
from functools import reduce

# main
def main():
    INF = 10**18
    N, M = list(map(int, input().split()))
    dist = []
    for i in range(N):
        dist.append([])
        for j in range(N):
            dist[i].append(INF)

    for _ in range(M):
        u, v, c = list(map(int, input().split()))
        dist[u][v] = c

    for i in range(N):
        dist[i][i] = 0

    for k in range(N):
        for x in range(N):
            for y in range(N):
                dist[x][y] = min(dist[x][y], dist[x][k] + dist[k][y])

    ans = 0
    for i in range(N):
        for j in range(N):
            ans += dist[i][j]

    print(ans)    

# エントリポイント
if __name__ == '__main__':
    main()