//  main.cpp
//  solve
//
//  Created by Ahmed on 11/16/16.
//  Copyright © 2016 Abdellah. All rights reserved.
//


#include<set>
#include<map>
#include <unordered_map>
#include <unordered_set>
#include<list>
#include<iomanip>
#include<cmath>
#include<string>
#include<vector>
#include<queue>
#include<stack>
#include<complex>
#include<sstream>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<numeric>
#include<utility>
#include<functional>
#include<stdio.h>
#include<assert.h>
#include<memory.h>
#include<bitset>
#include<math.h>
#include <strings.h>
#include <array>


#define f first
#define s second
#define pb push_back
#define sz(a) (int)a.size()
#define lp(i,a,n) for(int (i)=(a);(i)<=(int)(n);(i)++)
#define lpd(i,n,a) for(ll (i)=(n);(i)>=(a);--(i))
#define mp make_pair
#define clr(a,b) memset(a,b,sizeof a)
#define all(v) v.begin(),v.end()
#define mod 1000000007
#define eps 1e-6
#define infi 1000000002
#define infll 1000000000000000000ll
#define MX 1000000
#define X real()
#define Y imag()
#define polar(r,t) ((r)* exp(point(0,(t))))
#define length(a) hypot( (a).X , (a).Y )
#define angle(a) atan2( (a).Y , (a).X )
#define vec(a,b) ( (b) - (a) )
#define dot(a,b) (conj(a)*(b)).X
#define cross(a,b) (conj(a)*(b)).Y
#define lengthsqr(a) dot(a,a)
#define reflect(V,M) (conj((V)/(M)) * (M))
#define normalize(a)   ((a)/length(a))
#define ccw(a,b,c)   cross(vec(a,b) , vec(a,c)) > -eps
#define cosRule(a,b,c) (acos(((a)*(a)+(b)*(b)-(c)*(c))/(2*(a)*(b))))
#define cosDot(a,b) (acos(dot(a,b)/length(a)/length(b)))
#define EQ(a,b) (fabs((a) - (b)) <= eps) /* equal to */
#define NE(a,b) (fabs((a) - (b)) > eps)  /* not equal to */
#define LT(a,b) ((a) < (b) - eps)        /* less than */
#define GT(a,b) ((a) > (b) + eps)        /* greater than */
#define LE(a,b) ((a) <= (b) + eps)       /* less than or equal to */
#define GE(a,b) ((a) >= (b) - eps)       /* greater than or equal to */
#define mod1 100050001
#define mod2 100030001
#define base1 37
#define base2 31
#define que priority_queue<pair<int,int>, vector<pair<int,int>> , greater<pair<int,int> > >
#define rotate(v,t) ((v)*exp(point(0,t)))
#define rotateabout(v,t,a) (rotate(vec(a,v),t)+(a))
#define PI atan(1)*4

using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef pair<double,double> pdd;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<vi> vvi;
typedef set<int> si;
typedef map<int, int> mii;
typedef map<long, long> mll;
typedef complex<long double> point;
typedef pair<point, point> line;
typedef pair<double , point> Circle;




const int N = 302;

struct edge {
    int from,to,w;
    edge (int from , int to ,int w) : from(from) , to(to) , w(w) {}
    bool operator < (const edge &e) const {
        return w > e.w;
    }
    
};

int n,a[N][N];
bool skip[N][N];
vector<edge> edgeList;
vi adjL[N];

vi parent;

void reset (int n) {
    parent = vi(n+1);
    lp(i,1,n) parent[i] = i;
}

int find_set(int x){
    if(x == parent[x]) return x;
    return parent[x] = find_set(parent[x]);
}

bool union_sets(int x,int y){
    x = find_set(x) , y = find_set(y);
    parent[x] = y;
    
    return x !=y ;
}


ll MST_Kruskal() {
    ll mstcoast = 0;
    reset(n);
    priority_queue <edge> q;
    
    for(int i=0;i<(int) edgeList.size() ;i++)
        q.push(edgeList[i]);
    
    while(!q.empty()) {
        edge e = q.top();       q.pop();
        if(union_sets( e.from , e.to )) {
            adjL[e.from].pb(e.to);
            adjL[e.to].pb(e.from);
            mstcoast+=e.w;
        }
    }
    
    return mstcoast;
}

//void  dfs(int root,int node,ll d) {
//    b[root][node]
//}

int main()
{
    scanf("%d",&n);
    
    lp(i, 1, n) lp(j, 1, n) {
        scanf("%d",&a[i][j]);
        edgeList.pb({i,j,a[i][j]});
    }
    
    lp(k, 1, n){

        lp(i, 1, n) if(i != k) lp(j, 1, n) if(i != j && j != k){
            if(a[i][k] + a[k][j] < a[i][j]) return printf("-1\n"),0;
            if(a[i][k] + a[k][j] == a[i][j] )
                skip[i][j] = true;
        }
        
        
    }
    
    
    ll ans = 0;
    lp(i, 1, n) lp(j, i+1, n)
        if(!skip[i][j])
            ans += a[i][j];
    
    printf("%lld\n", ans);
    
    return 0;
}

/*
*/
//freopen("output.txt","w",stdout);
//freopen("input.txt","r",stdin);
//ios::sync_with_stdio(0);cin.tie(0);

Measured memory_bytes: 2168