#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;
}