#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
//BFS+拆点
//与迷宫那题很像,区别是本题的地图,是否能走,有时间限制,有些格子只能在规定的时间内走
const int N = 110,M = 310;
int n,m,T;
bool g[N][N][M],d[N][N][M],st[N][N][M];
struct Node
{
int x,y,z;
};
int bfs()
{
queue<Node> q;
d[1][1][0] = true;//(1,1)在0时刻标记为1,表示走过了
q.push({1,1,0});
int dx[] = {0,-1,0,1},dy[] = {1,0,-1,0};
while(q.size())
{
auto t = q.front();
q.pop();
for(int i = 0; i<4; i++)
{
int x = t.x+dx[i], y = t.y+dy[i], z = t.z+1; //z时间
if(x<1 || x>n || y<1 || y>m || g[x][y][z]) continue;
if(!st[x][y][z])//如果当前格子没有走过
{
if(x==n && y==m) return z;//到终点,返回花费时间t
st[x][y][z] = true;
q.push({x,y,z});
}
}
}
return -1;
}
int main()
{
cin>>n>>m>>T;
while(T--)
{
int x,y,a,b;
cin>>x>>y>>a>>b;
//标记(x,y)在a到b时刻不能走,都标记为1
for(int i = a; i<=b; i++)
g[x][y][i] = true;
}
cout<<bfs();
return 0;
}