#include<bits/stdc++.h>
using namespace std;

#define INF 1000000009
using ll=long long;


struct salesman{
    // 頂点数Nのセールスマン 0スタート
    ll N;
    vector<vector<ll>> g;
    ll MAXN=17;
    vector<vector<ll>> dp;
    ll ans=INF;

    salesman(ll n){
        N=n;
        g.resize(n);
        dp.resize(1<<N);
        for (ll i=0;i<(1<<N);i++){
            dp[i].resize(n);
        }
        for (ll i=0;i<n;i++){
            g[i].resize(n);
            for (ll j=0;j<n;j++){
                g[i][j]=INF;
            }
            g[i][i]=0;
        }
        for (ll r=0;r<(1<<N);r++){
            for (ll i=0;i<N;i++){
                dp[r][i]=INF;
            }
        }
    };

    // 有向グラフ
    void add_edge(ll from,ll to,ll cost){
        g[from][to]=cost;
    };
    //  0に戻ってくる時の最小コスト和
    void run(){
        dp[0][0]=0;
        for (ll r=0;r<(1<<N);r++){
            for (ll l=0;r>>l>0;l++){
                if ((r>>l)&1){
                    for (ll u=0;u<N;u++){
                        if (g[u][l]!=INF) dp[r][l]=min(dp[r][l],dp[r-(1<<l)][u]+g[u][l]);
                    }
                }
            }
        }
        for (ll i=1;i<N;i++){
            if (g[i][0]!=INF && dp[(1<<N)-1][i]!=INF) ans=min(dp[(1<<N)-1][i]+g[i][0],ans);
        }
    };
};

int main(){
    ll N;cin >> N;
    vector<ll> X(N);
    vector<ll>Y(N);
    vector<ll> Z(N);
    salesman solver(N);
    for (int i=0;i<N;i++){
        cin >> X[i] >> Y[i] >> Z[i];
    }
    for (int i=0;i<N;i++){
        for (int j=0;j<N;j++){
            ll cost=0;
            if (Z[j]-Z[i]>=0) cost=abs(X[i]-X[j])+abs(Y[i]-Y[j])+Z[j]-Z[i];
            else cost=abs(X[i]-X[j])+abs(Y[i]-Y[j]);
            solver.add_edge(i,j,cost);
        }
    }
    solver.run();
    cout << solver.ans << endl;
    return 0;
}



#include<bits/stdc++.h>
using namespace std;

int main(){
    int N; cin >> N;
    vector<double> a(N),b(N),c(N),d(N);
    for(int _=0; _<2; _++){
        for(int i=0; i<N; i++) cin >> a[i] >> b[i];
        int x = 0, y = 0;
        for(int i=0; i<N; i++){
            x += a[i];
            y += b[i];
            a[i] *= N;
            b[i] *= N;
        }
        for(int i=0; i<N; i++){
            a[i] -= x;
            b[i] -= y;
        }
        swap(a,c);
        swap(b,d);
    }
    for(int i=0; i<N; i++){
        if(a[i]!=0 || b[i]!=0){
            swap(a[i],a[0]);
            swap(b[i],b[0]);
        }
    }
    string ans = "No";
    const double eps = 1e-6;
    for(int i=0; i<N; i++){
        double angle = atan2(d[i],c[i])-atan2(b[0],a[0]);
        bool flag = true;
        for(int j=0; j<N; j++){
            double A = a[j]*cos(angle)-b[j]*sin(angle);
            double B = a[j]*sin(angle)+b[j]*cos(angle);
            bool flag2 = false;
            for(int k=0; k<N; k++){
                if(std::abs(A-c[k])<=eps && std::abs(B-d[k])<=eps) flag2 = true;
            }
            flag &= flag2;
        }
        if(flag) ans = "Yes";
    }
    cout << ans << endl;
}
