#include<iostream>
using namespace std;
int r[150][150];
int a,b,x,y,c,ans=314159265;
void dfs(int x,int y,int money,bool magic){
int t=r[x][y];
if(r[x][y]==-1)return;
if(!x)return;
if(!y)return;
if(x>a)return;
if(y>a)return;
r[x][y]=-1;
if(x==a&&y==a){
ans=min(ans,money);
return;
}
if(!magic){
if(r[x][y]==r[x][y+1]){
dfs(x,y+1,money,0);
}else if(r[x][y+1]){
dfs(x,y+1,money+1,0);
}else{
int col=r[x][y+1];
dfs(x,y+1,money+2,1);
r[x][y+1]=col;
}
if(r[x][y]==r[x+1][y]){
dfs(x+1,y,money,0);
}else if(r[x+1][y]){
dfs(x+1,y,money+1,0);
}else{
int col=r[x+1][y];
dfs(x+1,y,money+2,1);
r[x+1][y]=col;
}
if(r[x][y]==r[x][y-1]){
dfs(x,y-1,money,0);
}else if(r[x][y-1]){
dfs(x,y-1,money+1,0);
}else{
int col=r[x][y-1];
dfs(x,y-1,money+2,1);
r[x][y-1]=col;
}
if(r[x][y]==r[x-1][y]){
dfs(x-1,y,money,0);
}else if(r[x-1][y]){
dfs(x-1,y,money+1,0);
}else{
int col=r[x-1][y];
dfs(x-1,y,money+2,1);
r[x-1][y]=col;
}
}else{
if(r[x][y]==r[x][y+1]){
dfs(x,y+1,money,0);
}else if(r[x][y+1]){
dfs(x,y+1,money+1,0);
}else{
return;
}
if(r[x][y]==r[x+1][y]){
dfs(x+1,y,money,0);
}else if(r[x+1][y]){
dfs(x+1,y,money+1,0);
}else{
return;
}
if(r[x][y]==r[x][y-1]){
dfs(x,y-1,money,0);
}else if(r[x][y-1]){
dfs(x,y-1,money+1,0);
}else{
return;
}
if(r[x][y]==r[x-1][y]){
dfs(x-1,y,money,0);
}else if(r[x-1][y]){
dfs(x-1,y,money+1,0);
}else{
return;
}
}
r[x][y]=t;
}
int main(){
cin>>a>>b;
for(int i=0;i<b;i++){
cin>>x>>y>>c;
if(c==0)c=2;
r[x][y]=c;
}
dfs(1,1,0,0);
if(ans==314159265)ans=-1;
cout<<ans;
return 0;
}