#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#define maxtime 9999
using namespace std;
int sum, flag, m, map[305][305], book[305][305];
int dir[5][2]={0, 1, 1, 0, 0, -1, -1, 0, 0, 0};
struct node{
int x, y, time;
}meteors[50005];
struct nnode{
int x, y;
};
int cmp(node a, node b)
{
if(a.time<b.time)
return 1;
return 0;
}
void bfs()
{
nnode a, b;
int i, j, temp;
queue<nnode>q;
a.x=a.y=0;
q.push(a);
while(!q.empty())
{
a=q.front(); q.pop();
for(i=0;i<4;i++)
{
b.x=a.x+dir[i][0];
b.y=a.y+dir[i][1];
if(b.x>=0 && b.x<=305 && b.y>=0 && b.y<=305)
{
if(map[b.x][b.y]==maxtime)
{
sum=++book[a.x][a.y];
flag=1;
return ;
}
if(book[a.x][a.y]+1<map[b.x][b.y] && !book[b.x][b.y])
{
q.push(b);
book[b.x][b.y]=book[a.x][a.y]+1;
}
}
}
}
}
int main()
{
int i, j, tx, ty;
memset(book, 0, sizeof(book));
scanf("%d", &m);
flag=0;sum=0;
for(i=0;i<305;i++)
for(j=0;j<305;j++)
map[i][j]=maxtime;
for(i=0;i<m;i++)
scanf("%d%d%d", &meteors[i].x, &meteors[i].y, &meteors[i].time);
sort(meteors, meteors+m, cmp);
for(i=0;i<m;i++)
for(j=0;j<5;j++)
{
tx=meteors[i].x+dir[j][0];
ty=meteors[i].y+dir[j][1];
if(tx>=0 && tx<=305 && ty>=0 && ty<=305 && map[tx][ty]>meteors[i].time)
map[tx][ty]=meteors[i].time;
}
if(map[0][0]==0)
{
sum=-1;
flag=1;
}
else if(map[0][0]==maxtime)
{
sum=0;
flag=1;
}
else
bfs();
if(flag)
printf("%d\n", sum);
else
printf("-1\n");
return 0;
}