#include
#define rep(i,x,n) for(int i=x;i<=n;i++)
using namespace std;
struct node{
int x,y;
};
int n;
int f[500][500];//记录步长和判重
int g[500][500];
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
void bfs()
{
queue q;
q.push({1,1});
f[1][1]=1;
int x,y;
while(!q.empty())
{
auto w=q.front();
q.pop();
x=w.x,y=w.y;
//cout << x << ' ' << y << '\n';
if(g[x][y]==0x3f3f3f3f)
{
cout << f[x][y]-1;
exit(0);
}
rep(i,0,3)
{
int nx=x+dx[i],ny=y+dy[i];
if(!f[nx][ny]&&nx>=1&&ny>=1&&g[nx][ny]>f[x][y])
{
q.push({nx,ny});
f[nx][ny]=f[x][y]+1;
}
}
}
cout << -1;
}
int main()
{
memset(g,0x3f,sizeof g);//初始化地图
cin >> n;
rep(i,1,n)
{
int x,y,t;
cin >> x >> y >> t;
g[1+x][1+y]=min(t,g[1+x][1+y]);
rep(i,0,3) g[1+x+dx[i]][1+y+dy[i]]=min(t,g[1+x+dx[i]][1+y+dy[i]]);//设置好时间
}
bfs();
return 0;
}