#include using namespace std; const int dx[] = {0, 0, 0, -1, 1}; const int dy[] = {0, 1, -1, 0, 0}; struct node { int x, y, t; node() { x = y = t = 0; } node(int _x, int _y, int _t) { x = _x, y = _y, t = _t; } }; int n, x, y, t, m[305][305], f[305][305]; int main() { memset(m, 0x3f, sizeof(m)); cin >> n; for (int i = 1; i <= n; i++) { cin >> x >> y >> t; m[x][y] = min(m[x][y], t); for (int j = 1; j <= 4; j++) { int xx = x + dx[j]; int yy = y + dy[j]; if (xx < 0 || yy < 0) continue; m[xx][yy] = min(m[xx][yy], t); } } queue q; f[0][0] = 1; if (m[0][0] == 0x3f3f3f3f) { cout << 0 << endl; return 0; } q.push(node(0, 0, 0)); while (!q.empty()) { int xx = q.front().x; int yy = q.front().y; int tt = q.front().t; q.pop(); for (int i = 1; i <= 4; i++) { int u = xx + dx[i]; int v = yy + dy[i]; if (f[u][v] || u < 0 || v < 0 || tt + 1 >= m[u][v]) continue; if (m[u][v] == 0x3f3f3f3f) { cout << tt + 1 << endl; return 0; } q.push(node(u, v, tt + 1)); f[u][v] = 1; } } cout << -1 << endl; return 0; }