#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
using namespace std;
#define INF 2147483647
int m,n,x,y,c;
int M[110][110];
int f[110][110];
int Ans=INF;
bool vis[110][110];
int u[]={1,-1,0,0};
int v[]={0,0,1,-1};
void dfs(int x,int y,int cost,bool flag){
//use F[i][j] to memorize the best solution on (i,j)
if(x<1||x>m||y<1||y>m) return;
if(cost>=f[x][y])return;
f[x][y]=cost;
if(x==m&&y==m){
Ans=min(cost,Ans);
return;
}
for(int i=0;i<4;i++){
int nx=x+u[i],ny=y+v[i];
if(M[nx][ny]){
if(M[nx][ny]==M[x][y]) dfs(nx,ny,cost,0);
else dfs(nx,ny,cost+1,0);
}
else if(!flag){
M[nx][ny]=M[x][y];
dfs(nx,ny,cost+2,1);
M[nx][ny]=0;
}
}
}
int main(){
cin>>m>>n;
memset(f,127,sizeof(f)); //memset 是字符串语法不能直接全都赋值int初始化除了zero
for(int i=1;i<=n;i++){
cin>>x>>y>>c;
M[x][y]=c+1; // 0 无色 1 黄色 2 红色
}
dfs(1,1,0,0);
printf("%d\n",Ans==INF?-1:Ans);
return 0;
}