Buggy python submission (verdict: Time Limit Exceeded):
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))

Fixed submission:
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))

Buggy python submission (verdict: Time Limit Exceeded):
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))

Fixed submission:
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))

Buggy python submission (verdict: Time Limit Exceeded):
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))

Fixed submission:
def D_RestoringRoadNetwork(N, A):
    dist = [x[:] for x in A] # 全ての町同士の距離
    dist2 = [x[:] for x in A] # 不要な経路を削ぎ落とした町同士の距離
    isMinDist = True  # 与えられた行列が真に最短距離を表しているか

    # ワーシャルフロイド法
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if A[i][j] > dist[i][k] + dist[k][j]:
                    # 迂回路の方が短いとなれば元の行列は最短距離を表していない
                    isMinDist = False
                elif A[i][j] == dist[i][k] + dist[k][j] and dist[i][k] > 0 and dist[k][j] > 0:
                    # 最短経路でも迂回路でも同じ距離ならば、表にあった最短距離の経路は不要
                    dist2[i][j] = 0
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
    if isMinDist:
        ans = 0
        for i in range(N):
            for j in range(i, N):
                # 行列の上三角しか見ないのは、対称行列(ij成分=ji成分)になるから
                ans += dist2[i][j]
        return ans
    else:
        return -1

N=int(input())
A=[[int(i) for i in input().split()] for j in range(N)]
print(D_RestoringRoadNetwork(N, A))