#include<bits/stdc++.h>
using namespace std;
inline int read();
int a[3003][3003];
bool v[3003][3003];
bool f[3003][3003];
struct kid{
int i,j,t;
};
queue<kid>q;
map<int,bool>s,z;
int maxh,td=0x3f3f3f3f,tn=0x3f3f3f3f,ans=0x3f3f3f3f;
int main()
{
int n=read(),m=read(),k=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
a[i][j]=read();
maxh=max(a[i][j],maxh);
}
while(k--)
{
int i=read(),j=read();
f[i][j]=1;
}
q.push({1,1,0});
while(!q.empty())
{
int i=q.front().i,j=q.front().j,t=q.front().t;
v[i][j]=1;
q.pop();
if(i==n&&j==m)
{
ans=t;
break;
}
if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
q.push({i-1,j,t+1});
if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
q.push({i,j-1,t+1});
if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
q.push({i+1,j,t+1});
if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
q.push({i,j+1,t+1});
}
while(!q.empty())
q.pop();
q.push({1,1,0});
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
v[i][j]=0;
while(!q.empty())
{
int i=q.front().i,j=q.front().j,t=q.front().t;
v[i][j]=1;
q.pop();
if(t>td)
break;
if(f[i][j]==1)
{
s[a[i][j]]=1;
td=t;
}
if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
q.push({i-1,j,t+1});
if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
q.push({i,j-1,t+1});
if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
q.push({i+1,j,t+1});
if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
q.push({i,j+1,t+1});
}
while(!q.empty())
q.pop();
q.push({n,m,0});
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
v[i][j]=0;
while(!q.empty())
{
int i=q.front().i,j=q.front().j,t=q.front().t;
v[i][j]=1;
q.pop();
if(t>tn)
break;
if(f[i][j]==1)
{
z[a[i][j]]=1;
tn=t;
}
if(i-1>0&&v[i-1][j]==0&&a[i-1][j]!=0)
q.push({i-1,j,t+1});
if(j-1>0&&v[i][j-1]==0&&a[i][j-1]!=0)
q.push({i,j-1,t+1});
if(i+1<=n&&v[i+1][j]==0&&a[i+1][j]!=0)
q.push({i+1,j,t+1});
if(j+1<=m&&v[i][j+1]==0&&a[i][j+1]!=0)
q.push({i,j+1,t+1});
}
while(!q.empty())
q.pop();
if(td!=0x3f3f3f3f&&tn!=0x3f3f3f3f)
for(int i=1;i<=maxh;i++)
{
if(s.count(i)&&z.count(i))
break;
if(i==maxh)
td++;
}
if((td==0x3f3f3f3f||tn==0x3f3f3f3f)&&ans==0x3f3f3f3f)
cout<<"-1";
else if(td==0x3f3f3f3f||tn==0x3f3f3f3f)
cout<<ans;
else if(ans==0x3f3f3f3f)
cout<<td+tn+1;
else
cout<<min(ans,td+tn+1);
return 0;
}
inline int read()
{
int f=1,x=0;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return x*f;
}