#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
typedef pair<int,int> ii;
typedef pair<ii,ii> iii;
int grid[maxn][maxn];
int vis[maxn][maxn][2];
int s, t, u, v, n;
bool valid(int x, int y){
if(x>0 and y >0 and grid[x][u] == 0) return true;
return false;
}
int dx[4] = {0,1,0,-1}, dy[4] = {1,0,-1,0};
int dijks(){
vis[s][t][0] = 1;// veio na memsma col
vis[s][t][1] = 1; // veio na mesma linha
priority_queue<iii, vector<iii>, greater<iii>> q;
q.push({{1,0},{s,t}});
q.push({{1,1}, {s,t}});
while(!q.empty()){
auto [a,b] = q.top(); q.pop();
auto [dist, dir] = a;
auto [x,y] = b;
cout << x << ' '<< y << endl;
if(vis[x][y][dir] < dist) continue;
if(x == u and y == v) return dist;
for(int i=0; i<4; i++){
int xx = x+dx[i], yy = y + dy[i];
if(!valid(xx,yy)) continue;
if(yy == y){
int ddd = dist;
if(dir == 1) ddd ++;
if(vis[xx][yy][0] == -1 or vis[xx][yy][0] > ddd){
vis[xx][yy][0] = ddd;
q.push({{ddd, 0}, {xx,yy}});
}
}
if(xx == x){
int ddd = dist;
if(dir = 0) ddd++;
if(vis[xx][yy][1] == -1 or vis[xx][yy][1] > ddd){
vis[xx][yy][1] = ddd;
q.push({{ddd,1}, {xx,yy}});
}
}
}
}
return 0;
}
int main(){
cin >> s >> t >> u >> v >> n;
for(int i=0; i<n; i++){
int a,b,c,d; cin >> a >> b >> c >> d;
a++;
b--; c++; d--;
for(int j = a; j<=b; j++) for(int k = c; k<=d; k++) grid[j][k] = 1;
}
memset(vis, sizeof(vis), -1);
cout << dijks() << endl;
}