import java.io.IOException; import java.io.InputStream; import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.HashMap; import java.util.InputMismatchException; import java.util.NoSuchElementException; import java.util.PriorityQueue; public class Main { static PrintWriter out; static InputReader ir; static final int[] dx = { 0, 1, 0, -1 }; static final int[] dy = { 1, 0, -1, 0 }; static void solve() { int n = ir.nextInt(); int m = ir.nextInt(); HashMap mp = new HashMap<>(); for (int i = 0; i < m; i++) { int h = ir.nextInt() - 1; int w = ir.nextInt() - 1; long c = ir.nextLong(); mp.put((long) h << 10 | w, c); } Graph[] g = new Graph[n * n * 2]; for (int i = 0; i < n * n * 2; i++) g[i] = new Graph(); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < 4; k++) { int nx = i + dx[k]; int ny = j + dy[k]; if (nx < 0 || ny < 0 || nx >= n || ny >= n) continue; long cost = 1; if (mp.containsKey((long) nx << 10 | ny)) { cost += mp.get((long) nx << 10 | ny); } g[i * n + j].add(new long[] { nx * n + ny, cost }); g[n * n + i * n + j].add(new long[] { n * n + nx * n + ny, cost }); if (cost > 1) { g[i * n + j].add(new long[] { n * n + nx * n + ny, 1 }); } } } } long[] d = dijkstra(0, g); out.println(Math.min(d[n * n - 1], d[n * n * 2 - 1])); } public static long[] dijkstra(int s, Graph[] g) { long[] d = new long[g.length]; PriorityQueue pq = new PriorityQueue(new Comparator() { public int compare(long[] a, long[] b) { return Long.compare(a[1], b[1]); } }); Arrays.fill(d, 1L << 60); d[s] = 0; pq.offer(new long[] { s, 0 }); while (!pq.isEmpty()) { long[] p = pq.poll(); int from = (int) p[0]; if (d[from] != p[1]) continue; for (int i = 0; i < g[from].size(); i++) { long[] e = g[from].get(i); int to = (int) e[0]; if (d[to] > d[from] + e[1]) { d[to] = d[from] + e[1]; pq.offer(new long[] { to, d[to] }); } } } return d; } static class Graph extends ArrayList { } public static void main(String[] args) { ir = new InputReader(System.in); out = new PrintWriter(System.out); solve(); out.flush(); } static class InputReader { private InputStream in; private byte[] buffer = new byte[1024]; private int curbuf; private int lenbuf; public InputReader(InputStream in) { this.in = in; this.curbuf = this.lenbuf = 0; } public boolean hasNextByte() { if (curbuf >= lenbuf) { curbuf = 0; try { lenbuf = in.read(buffer); } catch (IOException e) { throw new InputMismatchException(); } if (lenbuf <= 0) return false; } return true; } private int readByte() { if (hasNextByte()) return buffer[curbuf++]; else return -1; } private boolean isSpaceChar(int c) { return !(c >= 33 && c <= 126); } private void skip() { while (hasNextByte() && isSpaceChar(buffer[curbuf])) curbuf++; } public boolean hasNext() { skip(); return hasNextByte(); } public String next() { if (!hasNext()) throw new NoSuchElementException(); StringBuilder sb = new StringBuilder(); int b = readByte(); while (!isSpaceChar(b)) { sb.appendCodePoint(b); b = readByte(); } return sb.toString(); } public int nextInt() { if (!hasNext()) throw new NoSuchElementException(); int c = readByte(); while (isSpaceChar(c)) c = readByte(); boolean minus = false; if (c == '-') { minus = true; c = readByte(); } int res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res = res * 10 + c - '0'; c = readByte(); } while (!isSpaceChar(c)); return (minus) ? -res : res; } public long nextLong() { if (!hasNext()) throw new NoSuchElementException(); int c = readByte(); while (isSpaceChar(c)) c = readByte(); boolean minus = false; if (c == '-') { minus = true; c = readByte(); } long res = 0; do { if (c < '0' || c > '9') throw new InputMismatchException(); res = res * 10 + c - '0'; c = readByte(); } while (!isSpaceChar(c)); return (minus) ? -res : res; } public double nextDouble() { return Double.parseDouble(next()); } public int[] nextIntArray(int n) { int[] a = new int[n]; for (int i = 0; i < n; i++) a[i] = nextInt(); return a; } public long[] nextLongArray(int n) { long[] a = new long[n]; for (int i = 0; i < n; i++) a[i] = nextLong(); return a; } public char[][] nextCharMap(int n, int m) { char[][] map = new char[n][m]; for (int i = 0; i < n; i++) map[i] = next().toCharArray(); return map; } } static void tr(Object... o) { System.err.println(Arrays.deepToString(o)); } }