#include <bits/stdc++.h>
using namespace std;
struct Node{
int x, y, visit[1000001], Dir;
};queue<Node>q;
int main() {
int Lu_x[4001];
int Lu_y[4001];
int Rd_x[4001];
int Rd_y[4001];
int Ice_x;
int Ice_y;
int N;
int Hole_x;
int Hole_y;
int Startx, Starty, Endx, Endy, Infinite = 1000001;
cin >> N;
cin >> Startx >> Starty >> Endx >> Endy;
for(int i = 1; i <= N; i++) {
cin >> Lu_x[i] >> Lu_y[i] >> Rd_x[i] >> Rd_y[i];
}
for(q.push((Node){0, Ice_x, Ice_y, 0}), q.push((Node){1, Ice_x, Ice_y, 0}); !q.empty();) {
int mx =-Infinite, mi = Infinite, p1 = 0, p2 = 0;
int Direction = q.front().Dir, Now_x = q.front().x, Now_y = q.front().y, N_shove = q.front().visit[p1<<2];
q.pop();
if(Direction) {
for(int i = 1; i <= N; i++) {
if(Lu_x[i] <= Now_x && Now_x <= Rd_x[i]) {
if(Lu_y[i] > Now_y && Lu_y[i] < mi) {
mi = Lu_y[i], p1 = i;
}
if(Rd_y[i] < Now_y && Rd_y[i] > mx) {
mx = Rd_y[i], p2 = i;
}
}
}
if(p1 && !q.front().visit[p1*4]) {
q.front().visit[p1*4] = 1, q.push((Node){0, Now_x, mi = 1, N_shove + 1});
}
if(p2 && !q.front().visit[p2*4|1]) {
q.front().visit[p2*4|1] = 1, q.push((Node){0, Now_x, mx + 1, N_shove - 1});
}
if(Now_x == Hole_x && mx <= Hole_y && Hole_y <= mi) {
cout << N_shove + 1;
}
}
}
return 0;
}