#include<iostream>
#include<queue>
#include<cstring>
#include<map>
using namespace std;
const int N=310;
int m,timee[N][N];
bool vis[N][N];
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
typedef pair<int,int> pii;
struct node{
    int x,y,t;
};
int bfs(){
    queue<node> q;
    node a;
    a.x=0,a.y=0,a.t=0;
    q.push(a);
    vis[0][0]=true;
    while(q.size()){
        auto t=q.front();
        int a=t.x,b=t.y,ti=t.t;
        q.pop();
        ti++;
        for(int i=0;i<4;i++){
            int x=a+dx[i],y=b+dy[i];
            if(x<0||y<0||vis[x][y]==true||(timee[x][y]!=-1&&ti>=timee[x][y])) continue;
            if(timee[x][y]==-1)
                return ti;
            vis[x][y]=true;
            node nxt;
            nxt.x=x,nxt.y=y,nxt.t=ti;
            q.push(nxt);
        }
    }
    return -1;
}
int main(){
    scanf("%d",&m);
    memset(timee,-1,sizeof timee);
    while(m--){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        if(timee[a][b]==-1)
            timee[a][b]=c;
        else
            timee[a][b]=min(timee[a][b],c);
        for(int i=0;i<4;i++){
            int x=a+dx[i],y=b+dy[i];
            if(x<0||y<0)
                continue;
            if(timee[x][y]==-1)
                timee[x][y]=c;
            else
                timee[x][y]=min(timee[x][y],c);
        }
    }
    printf("%d",bfs());
    return 0;
}