#include<bits/stdc++.h>
using namespace std;
int m, n;
int a[110][110];
int ans[110][110];
bool b[110][110];
struct node {
int x, y, s_color, number;
};
queue<node> q;
int dx[] = {0, -1, 1, 0};
int dy[] = {1, 0, 0, -1};
int bfs(int x, int y) {
q.push({x, y, a[x][y], 1});
ans[x][y] = 0;
b[1][1] = 1;
while (!q.empty()) {
node t = q.front();
q.pop();
if (t.x == m && t.y == m)
return ans[m][m];
for (int i = 0; i < 4; i++) {
int xx = t.x + dx[i];
int yy = t.y + dy[i];
if (xx >= 1 && yy >= 1 && xx <= m && yy <= m && !b[xx][yy]) {
b[xx][yy] = 1;
int numb = t.number;
int an = 0;
if (a[xx][yy] == -1) {
if (!numb)
continue;
numb = 0;
a[xx][yy] = a[t.x][t.y];
an = 2;
} else if (a[t.x][t.y] != a[xx][yy])
an = 1, numb = 1;
else
numb = 1;
bool flag = false;
if (ans[xx][yy] > ans[t.x][t.y] + an) {
ans[xx][yy] = ans[t.x][t.y] + an;
flag = true;
}
if (flag)
q.push({xx, yy, a[xx][yy], numb});
}
}
}
return -1;
}
int main() {
memset(a, -1, sizeof(a));
memset(ans, 0x3f, sizeof(ans));
scanf("%d%d", &m, &n);
for (int i = 1; i <= n; i++) {
int x, y, v;
scanf("%d%d%d", &x, &y, &v);
a[x][y] = v;
}
cout << bfs(1, 1);
return 0;
}