record
#include <bits/stdc++.h>
using namespace std;
struct graph
{
int t=1e9;
bool v=0;
};
graph g[320][320];
const int xw[4]= {-1,1,0,0},yw[4]= {0,0,1,-1};
int ans[320][320];
queue <int> qx,qy;
bool book[320][320];
int main()
{
int m;
scanf("%d",&m);
for(int i=1; i<=m; i++)
{
int x,y,ti;
scanf("%d%d%d",&x,&y,&ti);
g[x][y].v=1;
g[x][y].t=ti;
for(int i=0;i<=3;i++)
{
int nx=x+xw[i],ny=y+yw[i];
if(nx<0 || ny<0)
continue;
g[nx][ny].v=1;
g[nx][ny].t = min(g[nx][ny].t,ti);
}
}
bool flag=true;
book[0][0]=1;
ans[0][0]=0;
qx.push(0);
qy.push(0);
if(g[0][0].v==0)
{
cout<<0;
return 0;
}
while(!qx.empty())
{
int sx=qx.front(),sy=qy.front();
qx.pop();
qy.pop();
for(int i=0; i<4; i++)
{
int nx=sx+xw[i],ny=sy+yw[i];
if(nx>=0 && ny>=0 && book[nx][ny]==0)
{
if(g[nx][ny].v==0)
{
cout<<ans[sx][sy]+1;
return 0;
}
else if(g[nx][ny].t>ans[sx][sy]+1)
{
ans[nx][ny]=ans[sx][sy]+1;
qx.push(nx);
qy.push(ny);
book[nx][ny]=1;
}
}
}
}
printf("-1");
return 0;
}