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

/* package codechef; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;

/* Name of the class has to be "Main" only if the class is public. */
public class Solution
{
     public static class pair{
        int first,second;
        pair(int a , int b){
            first = a;
            second = b;
        }
    }
    
     public static class triplate{
        int row,colom,steps;
        triplate(int a , int b , int c){
            row = a;
            colom = b;
            steps = c;
        }
    }
    
    
	public static void main (String[] args) throws java.lang.Exception
	{
		// your code goes here
		 Scanner sc = new Scanner(new BufferedReader(new InputStreamReader(System.in)));
	                        	int x0 = sc.nextInt();
		                     	int y0 = sc.nextInt();
			                 	int x1 = sc.nextInt();
			             		int y1 = sc.nextInt();
					          	int n = sc.nextInt();
						HashSet<String> valid = new HashSet<String>();
						
					    HashSet<String> visited = new HashSet<String>();
						
	                      	for(int i =1;i<=n;i++){
		                      int row = sc.nextInt();
		                       int c1 = sc.nextInt();
		                        int c2 = sc.nextInt();
		                        
		                        for(int j =c1;j<=c2;j++){
		                           
		                            valid.add((String.valueOf(row)+" "+String.valueOf(j)));
		                        }
		                        	}
		                        	
		                        	
		                        	
                         int dx[]={-1,-1,-1,0,1,1,1,0};
                         int dy[]={-1,0,1,1,1,0,-1,-1};
		                        	
		                        	// 0 = row , 1 = colom ,2 =  steps
		                  ArrayList<triplate> queue = new ArrayList<triplate>();   
		                  
		                       
		                       queue.add(new triplate(x0 , y0 , 0));
		                       //adding in visited array
                               
                                visited.add(String.valueOf(x0)+" "+String.valueOf(y0));
                                
		                       //apply BFS
		                       boolean not_found  = true ;
		                       int final_steps = -1;
		                       
		                       while(queue.size() != 0 && not_found){
		                           // pop top else
		                           int row_no = queue.get(0).row;
		                           int col_no = queue.get(0).colom;
		                           int step = queue.get(0).steps;
		                           
		                           queue.remove(0);
		                           
		                          System.out.println("Reached : "+ row_no +" "+col_no);
		                           
		                           // check it is the final destinaton?
		                           if(row_no == x1 && col_no == y1){
		                               not_found = false;
		                               final_steps = step;
		                           }else{
		                               // moveing king in 8 directions
		                               
		                               for(int j =0 ;j<8;j++){
		                               
		                              int new_row = row_no + dx[j];
		                              int new_colom = col_no + dy[j];
		                              
		                              if(valid.contains(String.valueOf(new_row)+" "+String.valueOf(new_colom))==true && visited.contains(String.valueOf(new_row)+" "+String.valueOf(new_colom))==false){
		                                  queue.add(new triplate(new_row , new_colom , step + 1));
		                                  visited.add(String.valueOf(new_row)+" "+String.valueOf(new_colom));
		                                  
		                              }
		                              
		                              
		                               
		                               }
		                               
		                           }
		                           
		                           
		                       }
		                       
		                       System.out.println(final_steps);
		                        	
			
			
			
			
	}
}
