#include<stdio.h>
#define NM 50
int A[NM][NM],n,m,ck,x1,y1,x2,y2,lmin,nn;
int st[NM*NM+1],stc[NM*NM+1],viz[NM*NM+1],v[NM*NM+1];
int pozi,poz,l,c;
int valid(int k){
if(poz==-1||viz[poz]==1||v[poz]==0) return 0;
return 1;
}
void sol(int k){
int i,pr=1,ok=0;
for(i=0;i<=k&&!ok;++i){
pr*=stc[i]%ck;
if(pr>ck) pr%=ck;
if(pr==0)ok=1;
}
if(ok&&k<lmin) lmin=k;
}
void bkt(){
int k,up,lt,ct,pozt;
k=0;stc[k]=pozi;st[k]=0;viz[poz]=1;
while(k>=0){
up=0;
while(!up&&st[k]<4){
st[k]++;
lt=l,ct=c,pozt=poz;
switch(st[k]){
case 1:l--;break;
case 2:c++;break;
case 3:l++;break;
case 4:c--;
}
//poz=1 inseamna iesit afara
if(l<0||c<0||l==n||c==m) poz=-1;
else poz=c+l*n;
if(valid(k)) {up=1;viz[poz]=1;}
else {l=lt,c=ct,poz=pozt;}
}
if(up)
if(l==y2-1&&c==x2-1){
sol(k);
viz[poz]=0;
l=lt,c=ct,poz=pozt;
}
else
if(k==lmin) goto back;
else {k++,st[k]=0,stc[k]=poz;}
else{
back:
viz[poz]=0,k--;
l=stc[k]/n,c=stc[k]%n;
poz=l*n+c;
}
}
}
int main(){
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
int i,j;
scanf("%d%d%d",&n,&m,&ck);
lmin=n*m;
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
c=x1-1;l=y1-1;
poz=pozi=l*n+c;
for(i=0;i<n;++i)
for(j=0;j<m;++j) {
scanf("%d",&A[i][j]);
v[i*n+j]=A[i][j];
if(A[i][j]) nn++;
}
bkt();
printf("%d",lmin+2);
return 0;
}