#include<bits/stdc++.h>
using namespace std;
int mi=INT_MAX,n,m;
int p1[]={0,0,0,0,1,-1,2,-2,1,1,-1,-1};
int p2[]={1,-1,2,-2,0,0,0,0,1,-1,1,-1};
int p3[]={0,0,2,2,0,0,2,2,2,2,2,2};
int wx,wy,w,a[105][105],b[105][105];
void dfs(int x,int y,int t){
if(x>n||x<0||y>n||y<0||a[x][y]==-1){
return ;
}
if(t>=mi)
return ;
if(x==n&&y==n){
b[n][n]=min(b[n][n],t);
return ;
}
if((x+1==n||y+1==n)&&a[n][n]==0){
b[n][n]=min(b[n][n],t+2);
return ;
}
if(t>=b[x][y])
return ;
b[x][y]=t;
for(int i=0;i<12;i++){
int xx=x+p1[i];
int yy=y+p2[i];
int d=t+p3[i];
if(a[xx][yy]==0)
continue;
if(a[xx][yy]!=a[x][y])
d++;
int s=a[x][y];
a[x][y]=-1;
dfs(xx,yy,d);
a[x][y]=s;
}
return ;
}
int main(){
cin>>n>>m;
while(m--){
cin>>wx>>wy>>w;
w++;
a[wx][wy]=w;
}
for(int i=1;i<=n;i++){
for(int t=1;t<=n;t++){
b[i][t]=INT_MAX;
}
}
dfs(1,1,0);
if(b[n][n]==INT_MAX)
b[n][n]=-1;
cout<<b[n][n];
return 0;
}