#include <iostream>
#include<queue>
#include<vector>
using namespace std;

struct Node{
    int x,y,step;
    Node(int x_,int y_,int step_):x(x_),y(y_),step(step_){}
};
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,m;
    cin>>n>>m;
    int k;
    cin>>k;
    vector<vector<char>>grid(n,vector<char>(m,'.'));
    for(int i=0;i<k;i++){
        int x,y;
        cin>>x>>y;
        x--;
        y--;
        grid[x][y]='*';
    }
    vector<vector<bool>>visited(n,vector<bool>(m,false));
    queue<Node>q;
    int xs,ys,xt,yt;
    cin>>xs>>ys>>xt>>yt;
    xs--;
    ys--;
    xt--;
    yt--;
    q.push(Node(xs,ys,0));
    visited[xs][ys]=true;
    int dirs[4][2]={{-2,-2},{-2,2},{2,-2},{2,2}};
    int res=-1;
    while(!q.empty()){
        Node curr=q.front();
        q.pop();
        if(curr.x==xt&&curr.y==yt){
            res=curr.step;
            break;
        }
        for(auto&d:dirs){
            int x=curr.x+d[0];
            int y=curr.y+d[1];
            int eyex=curr.x+d[0]/2;
            int eyey=curr.y+d[1]/2;
            if(x<0||x>=n||y<0||y>=m||grid[eyex][eyey]=='*'||visited[x][y])continue;
            visited[x][y]=true;
            q.push(Node(x,y,curr.step+1));
        }
    }
    cout<<res<<endl;
    return 0;
}