1 1 1 2
5
1000000000 1 10000
19920401 1188 5566
1000000000 1 10000
1 1 10000
5 100 200
 6 15 7 15
9
6 15 15
7 14 14
6 15 15
9 14 14
7 14 16
6 15 15
6 15 15
7 14 14
8 15 15
 1 1 1000000000 2
5
1000000000 1 10000
19920401 1188 5566
1000000000 1 10000
1 1 10000
5 100 200
 89 29 88 30
16
87 31 31
14 95 95
98 88 89
96 88 88
14 97 97
13 97 98
100 88 88
88 32 32
99 88 89
90 29 29
87 31 31
15 94 96
89 29 29
88 32 32
97 89 89
88 29 30
 30 14 39 19
31
35 7 11
37 11 12
32 13 13
37 5 6
46 13 13
37 14 14
31 13 13
43 13 19
45 15 19
46 13 13
32 17 17
41 14 19
30 14 14
43 13 17
34 16 18
44 11 19
38 13 13
40 12 20
37 16 18
46 16 18
34 10 14
36 9 10
36 15 19
38 15 19
42 13 19
33 14 15
35 15 19
33 17 18
39 12 20
36 5 7
45 12 12
 9 8 7 8
9
10 6 6
10 6 6
7 7 8
9 5 6
8 9 9
9 5 5
9 8 8
8 5 6
9 10 10
 2 1 1 1
2
1 1 2
2 1 2
 13 16 20 10
18
13 16 16
20 10 10
19 10 10
12 15 15
20 10 10
18 11 11
19 10 10
19 10 10
20 10 10
19 10 10
20 10 10
20 10 10
19 10 10
18 11 11
13 16 16
12 15 15
19 10 10
19 10 10

1
 1
 -1
 1
 9
 2
 1
 -1

#include <bits/stdc++.h>
using namespace std;
struct mmp {
  int a, b, c;
};
mmp a[100001], b[100001], d[100001];
int sx, sy, gx, gy, t, wer;
bool cmp(mmp x, mmp y) { return x.a < y.a; }
int bfs(int x, int y) {
  int i = 0, j = 0;
  int e[t + 1][wer + 1];
  bool c[t + 1][wer + 1];
  d[i].a = x;
  d[i++].b = y;
  e[x][y] = 0;
  c[x][y] = 1;
  while (j < i) {
    int o = d[j].a, p = d[j].b;
    if (o + 1 < t && c[o + 1][p] == 0 && b[o + 1].b <= p && b[o + 1].c >= p) {
      d[i].a = o + 1;
      d[i++].b = p;
      c[o + 1][p] = 1;
      e[o + 1][p] = e[o][p] + 1;
    }
    if (p + 1 < wer && c[o][p + 1] == 0 && b[o].b <= p + 1 && b[o].c >= p + 1) {
      d[i].a = o;
      d[i++].b = p + 1;
      c[o][p + 1] = 1;
      e[o][p + 1] = e[o][p] + 1;
    }
    if (o + 1 < t && p + 1 < wer && c[o + 1][p + 1] == 0 &&
        b[o + 1].b <= p + 1 && b[o + 1].c >= p + 1) {
      d[i].a = o + 1;
      d[i++].b = p + 1;
      c[o + 1][p + 1] = 1;
      e[o + 1][p + 1] = e[o][p] + 1;
    }
    if (o - 1 >= 0 && c[o - 1][p] == 0 && b[o - 1].b <= p && b[o - 1].c >= p) {
      d[i].a = o - 1;
      d[i++].b = p;
      c[o - 1][p] = 1;
      e[o - 1][p] = e[o][p] + 1;
    }
    if (p - 1 >= 0 && c[o][p - 1] == 0 && b[o].b <= p - 1 && b[o].c >= p - 1) {
      d[i].a = o;
      d[i++].b = p - 1;
      c[o][p - 1] = 1;
      e[o][p - 1] = e[o][p] + 1;
    }
    if (o - 1 >= 0 && p - 1 >= 0 && c[o - 1][p - 1] == 0 &&
        b[o - 1].b <= p - 1 && b[o - 1].c >= p - 1) {
      d[i].a = o - 1;
      d[i++].b = p;
      c[o - 1][p - 1] = 1;
      e[o - 1][p - 1] = e[o][p] + 1;
    }
    if (o + 1 < t && p - 1 >= 0 && c[o + 1][p - 1] == 0 &&
        b[o + 1].b <= p - 1 && b[o + 1].c >= p - 1) {
      d[i].a = o + 1;
      d[i++].b = p - 1;
      c[o + 1][p - 1] = 1;
      e[o + 1][p - 1] = e[o][p] + 1;
    }
    if (p + 1 < wer && o - 1 >= 0 && c[o - 1][p + 1] == 0 &&
        b[o - 1].b <= p + 1 && b[o - 1].c >= p + 1) {
      d[i].a = o - 1;
      d[i++].b = p + 1;
      c[o - 1][p + 1] = 1;
      e[o - 1][p + 1] = e[o][p] + 1;
    }
    if (o == gx && p == gy) break;
    j++;
  }
  if (e[gx][gy] != 0)
    return e[gx][gy];
  else
    return -1;
}
int main() {
  int n, j, ans = 100000;
  cin >> sx >> sy >> gx >> gy >> n;
  if (sx == gx && sy == gy) {
    cout << 0;
    return 0;
  }
  for (int i = 0; i < n; i++) cin >> a[i].a >> a[i].b >> a[i].c;
  sort(a, a + n, cmp);
  for (int i = 0; i < n - 1; i++) {
    if (a[i].a + 1 != a[i + 1].a && a[i].a != a[i + 1].a) {
      if (sx <= a[i].a)
        break;
      else {
        t = 0;
        continue;
      }
    }
    b[t].a = a[i].a;
    b[t].b = a[i].b;
    b[t++].c = a[i].c;
  }
  b[t].a = a[n - 1].a;
  b[t].b = a[n - 1].b;
  b[t++].c = a[n - 1].c;
  sx -= b[0].a;
  gx -= b[0].a;
  j = b[0].a;
  for (int i = 0; i < t; i++) {
    b[i].a -= j;
  }
  j = 0;
  for (int i = 0; i < t - 1; i++) {
    if (b[i].a == b[i + 1].a) {
      b[i + 1].b = min(b[i + 1].b, b[i].b);
      b[i + 1].c = max(b[i + 1].c, b[i].c);
      j++;
    }
  }
  sort(b + j, b + t, cmp);
  for (int i = 0; i < t - j; i++) {
    b[i].a = b[i + j].a;
    b[i].b = b[i + j].b;
    b[i].c = b[i + j].c;
    ans = min(ans, b[i].b);
  }
  t -= j;
  for (int i = 0; i < t; i++) {
    b[i].b -= ans;
    b[i].c -= ans;
    wer = max(wer, b[i].c);
  }
  wer++;
  sy -= ans;
  gy -= ans;
  if (sx >= 0 && sy >= 0 && sx <= t && sy <= wer && gx >= 0 && gy >= 0 &&
      gx <= t && gy <= wer)
    cout << bfs(sx, sy);
  else
    cout << -1;
  return 0;
}
