#include<iostream>
#include<queue>
#include<algorithm>
#include<utility>

using namespace std;

int W,H,N;

bool w[100][100];
int ix,iy,ox,oy;

struct S{
  int y,x,t;
};

int dst(){
  queue<S> que;
  que.push({iy*2,ix*2,0});
  bool p[100][100]={};
  while(!que.empty()){
    S cs=que.front();
    if(cs.y==oy*2&&cs.x==ox*2)return cs.t;
    que.pop();
    if(p[cs.y][cs.x]++)continue;
    for(int i=0;i<4;i++){
      static int d[]={0,1,0,-1,0};
      int ny=cs.y+d[i]*2;
      int nx=cs.x+d[i+1]*2;
      if(0<=ny&&ny<H*2&&0<=nx&&nx<W*2&&!w[cs.y+d[i]][cs.x+d[i+1]]){
	que.push({ny,nx,cs.t+1});
      }
    }
  }
  return 0;
}

int main(){
  cin>>W>>H>>N;
  while(N--){
    int sx,sy,dx,dy;
    cin>>sx>>sy>>dx>>dy;
    if(sx>dx){
      swap(sx,dx);
    }
    if(sy>dy){
      swap(sy,dy);
    }
    if(sx==dx){
      if(sx)
	for(int i=sy;i<dy;i++){
	  w[i*2][sx*2-1]=true;
	}
    }else{
      if(sy)
      for(int i=sx;i<dx;i++){
	w[sy*2-1][i*2]=true;
      }
    }
  }
  cin>>ix>>iy>>ox>>oy; 
  int b=dst();
  int m=0;
  for(int i=0;i<H*2;i++){
    for(int j=0;j<W*2;j++){
      if(!w[i][j]){
	w[i][j]=true;
	m=max(m,dst()-b);
	w[i][j]=false;
      }
    }
  }
  cout<<m<<endl;
}
	  