#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define P pair<int,int>
struct Node
{
int st,end;//危险的开始时刻、结束时刻
Node(int s=0,int en=0)
{
st=s;
end=en;
}
}Map[101][101];
int n,m,t,dis[101][101];//d[i][j]表示从起点到i行j列的最小时间
int isvisit[101][101][301];//visited[i][j][k]为0表示在时刻k,第i行j列不能访问
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};//上下左右
void bfs()
{
queue< P > q;
memset(dis,0,sizeof(dis));
q.push(make_pair(1,1));
while(q.size()!=0)
{
P front=q.front();
q.pop();
if(front.first==n&&front.second==m)//如果取出的状态已经是终点,则结束搜索
break;
for(int i=0;i<4;i++)
{
int x=front.first+dx[i];
int y=front.second+dy[i];
if(x<1||x>n||y<1||y>m)//超出边界
continue;
int time=dis[front.first][front.second]+1;
if(isvisit[x][y][time]==0)//无法访问
continue;
isvisit[x][y][time]=0;
q.push(make_pair(x,y));
dis[x][y]=time;
}
}
}
int main()
{
cin>>n>>m>>t;
int l,r,a,b;
memset(isvisit,1,sizeof(isvisit));
for(int i=0;i<t;i++)
{
cin>>l>>r>>a>>b;
Map[l][r].st=a;
Map[l][r].end=b;
for(int j=a;j<=b;j++)
isvisit[l][r][j]=0;
}
bfs();
cout<<dis[n][m];
return 0;
}