#include<bits/stdc++.h>
using namespace std;
int x3[4]={-1,0,0,1},y3[4]={0,-1,1,0};
int n,m,k,ans=0x7fffffff;
int a[3001][3001];
int sum1[3001][3001];
int sum2[3001][3001];
struct node{
int qx,qy;
}s[6001];
void bfs(int q1,int q2,int w1,int w2){
int had=1,nxt=1;
s[1].qx=q1;s[1].qy=q2;
while(had<=nxt){
for(int i=0;i<=3;i++){
int px=s[had].qx+x3[i];
int py=s[had].qy+y3[i];
if(px==q1&&py==q2) continue;
if(a[px][py]==0||px<=0||px>n||py>m||py<=0||sum1[px][py]>0) continue;
s[++nxt].qx=px;s[nxt].qy=py;
sum1[px][py]=sum1[s[had].qx][s[had].qy]+1;
if(px==n&&py==m) ans=sum1[px][py];
}
had++;
}
}
void bfs2(int q1,int q2,int w1,int w2){
int had=1,nxt=1;
s[1].qx=q1;s[1].qy=q2;
while(had<=nxt){
for(int i=0;i<=3;i++){
int px=s[had].qx+x3[i];
int py=s[had].qy+y3[i];
if(px==q1&&py==q2) continue;
if(a[px][py]==0||px<=0||px>n||py>m||py<=0||sum2[px][py]>0) continue;
s[++nxt].qx=px;s[nxt].qy=py;
sum2[px][py]=sum2[s[had].qx][s[had].qy]+1;
}
had++;
}
}
struct n{
int sum=1e9,a1,x4,y4;
} fff[6001];
struct n2{
int sum=1e9,a1,x5,y5;
} ff[6001];
int main(){
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
}
}
bfs(1,1,n,m);
memset(s,0,sizeof s);
bfs2(n,m,1,1);
int xx,yy,nf=0,mf=0;
for(int i=1;i<=k;i++){
cin>>xx>>yy;
if(xx==1&&yy==1) {
nf=1;
fff[1].a1=a[1][1];
fff[1].sum=0;
fff[1].x4=1;
fff[1].y4=1;
continue;
}
if(xx==n&&yy==m) {
mf=1;
ff[1].a1=a[n][m];
ff[1].sum=0;
ff[1].x5=n;
ff[1].y5=m;
continue;
}
if(sum1[xx][yy]>0&&sum2[xx][yy]==0){
if(sum1[xx][yy]>fff[nf].sum) continue;
if(sum1[xx][yy]<fff[nf].sum) nf=0;
fff[++nf].sum=sum1[xx][yy];
fff[nf].a1=a[xx][yy];
fff[nf].x4=xx;
fff[nf].y4=yy;
}
else if(sum1[xx][yy]==0&&sum2[xx][yy]>0) {
if(sum2[xx][yy]>ff[mf].sum) continue;
if(sum2[xx][yy]<ff[mf].sum) mf=0;
ff[++mf].sum=sum2[xx][yy];
ff[mf].a1=a[xx][yy];
ff[mf].x5=xx;
ff[mf].y5=yy;
}
else {
if(sum1[xx][yy]<=fff[nf].sum) {
if(sum1[xx][yy]<fff[nf].sum) nf=0;
fff[++nf].sum=sum1[xx][yy];
fff[nf].a1=a[xx][yy];
fff[nf].x4=xx;
fff[nf].y4=yy;
}
if(sum2[xx][yy]<=ff[mf].sum){
if(sum2[xx][yy]<ff[mf].sum) mf=0;
ff[++mf].sum=sum2[xx][yy];
ff[mf].a1=a[xx][yy];
ff[mf].x5=xx;
ff[mf].y5=yy;
}
}
}
for(int i=1;i<=nf;i++){
for(int j=1;j<=mf;j++){
if(fff[i].x4==ff[j].x5&&fff[i].y4==ff[j].y5) continue;
if(fff[i].a1==ff[j].a1) ans=min(ans,fff[i].sum+ff[j].sum+1);
else ans=min(ans,fff[i].sum+ff[j].sum+2);
}
}
if(ans==0x7fffffff) cout<<-1;
else cout<<ans;
return 0;
}