간선 비용 중 최솟값만 받아들여야 한다.
import sys
from collections import deque
n = int(sys.stdin.readline().rstrip())
m = int(sys.stdin.readline().rstrip())
INF = sys.maxsize
nodes = [[INF for _ in range(n+1)] for _ in range(n+1)]
for i in range(n+1):
    nodes[i][i] = 0
for _ in range(m):
    a, b, c = map(int, sys.stdin.readline().rstrip().split())
    if nodes[a][b] > c:
        nodes[a][b] = c
    # 최단 경로만 받아들인다.
# 플로이드-워셜 알고리즘
for k in range(1, n+1):
    for i in range(1, n+1):
        for j in range(1, n+1):
            if nodes[i][j] > nodes[i][k] + nodes[k][j]:
                nodes[i][j] = nodes[i][k] + nodes[k][j]
# 갈 수 없는 도시, 즉 거리 무한인 도시는 0으로 표시
for i in range(1, n+1):
    for j in range(1, n+1):
        if nodes[i][j] == INF: nodes[i][j] = 0
for node in (nodes[1:]):
    print(*(node[1:]), sep=' ')