# Original solution
from functools import reduce
import math
import copy

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    N = int(eval(input()))
    a = []
    t_ans = {}
    ans = 0
    for i in range(N):
        a.append(list(int(_) for _ in input().split()))
    d = copy.deepcopy(a)
    
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if a[i][j] > a[i][k]+a[k][j]:
                    print((-1))
                    exit()
                elif a[i][j] == a[i][k]+a[k][j] and a[i][j] != 0 and k!=i and k!=j:
                    d[i][j] = 0
                    # if ((i,k) not in t_ans and (k,i) not in t_ans):
                    #     t_ans[i,k] = a[i][k]
                    # elif (i,k) in t_ans and t_ans[i,k] > a[i][k]:
                    #     t_ans[i,k] = a[i][k]
                    # elif (k,i) in t_ans and t_ans[k,i] > a[i][k]:
                    #     t_ans[i,k] = a[i][k]
                        
                    # if ((k,j) not in t_ans and (j,k) not in t_ans):
                    #     t_ans[k,j] = a[k][j]
                    # elif (k,j) in t_ans and t_ans[k,j] > a[k][j]:
                    #     t_ans[k,j] = a[k][j]
                    # elif (j,k) in t_ans and t_ans[j,k] > a[k][j]:
                    #     t_ans[j,k] = a[k][j]
    for i in range(N):
        ans += sum(d[i])
    print((ans//2))
    
if __name__ == '__main__':
    main()


# Optimized solution
from functools import reduce
import math
import copy

def main():
    # 文字列の2進数を数値にする
    # '101' → '5'
    # 文字列の頭に'0b'をつけてint()にわたす
    # binary = int('0b'+'101',0)

    # 2進数で立っているbitを数える
    # 101(0x5) → 2
    # cnt_bit = bin(5).count('1')
    
    # N! を求める
    # f = math.factorial(N)

    # N の逆元
    # N_inv = pow(N,MOD-2,MOD)

    # nCr
    # Nの階乗 * rの階乗の逆元 * n-rの階乗の逆元
    
    # 切り捨て
    # 4 // 3
    # 切り上げ
    #-(-4 // 3)
    
    # 初期値用:十分大きい数(100億)
    INF = float("inf")

    # 大きな素数
    MOD = 10**9+7
    
    # 1文字のみを読み込み
    # 入力:2
    # a = input().rstrip()
    # 変数:a='2'
    
    # スペース区切りで標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a, b, c, d = (int(_) for _ in input().split())  
    # 変数:a=2 b=4 c=5 d =7
    
    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2 4 5 7
    # a = list(int(_) for _ in input().split())
    # 変数:a = [2, 4, 5, 7]    

    # 1文字ずつ標準入力を配列として読み込み
    # 入力:2457
    # a = list(int(_) for _ in input())
    # 変数:a = [2, 4, 5, 7]    
    N = int(eval(input()))
    a = []
    ans = 0
    for i in range(N):
        a.append(list(int(_) for _ in input().split()))
    d = copy.deepcopy(a)
    
    for k in range(N):
        for i in range(N):
            for j in range(N):
                if a[i][j] > a[i][k]+a[k][j]:
                    print((-1))
                    exit()
                elif a[i][j] == a[i][k]+a[k][j] and a[i][j] != 0 and k!=i and k!=j:
                    d[i][j] = 0
          
    for i in range(N):
        ans += sum(d[i])
    print((ans//2))
    
if __name__ == '__main__':
    main()