#include<stdio.h>
#include<string.h>
struct coada{int x,y;}c[1000000];
int i,j,k,l,m,n,x[53][53],res[1000000],v[53][53],L,C,p,q,x1,x2,y1,y2;
int dl[]={0,0,1,0,-1},dc[]={0,1,0,-1,0};
FILE *f=fopen("kdrum.in","r");
FILE *g=fopen("kdrum.out","w");
void caut2(){
res[1]=x[x1][y1]%k;
while(p<=q)
{for(i=1;i<=4;i++)
{L=c[p].x+dl[i];
C =c[p].y+dc[i];
if(x[L][C]!=0&&L<=n&&C<=m&&L>0&&C>0)
{c[++q].x=L;
c[q].y=C;
v[L][C]=v[c[p].x][c[p].y]+1;
res[q]=(res[p]*x[c[p].x][c[p].y])%k;
if(L==x2&&C==y2&&res[q]==0)
{fprintf(g,"%d",v[L][C]);
return ;}
}
}
p++;
}
}
void caut1(){
while(p<=q)
{for(i=1;i<=4;i++)
{L=c[p].x+dl[i];
C =c[p].y+dc[i];
if(x[L][C]!=0&&L<=n&&C<=m&&L>0&&C>0)
{c[++q].x=L;
c[q].y=C;
v[L][C]=v[c[p].x][c[p].y]+1;
if(L==x2&&C==y2)
{fprintf(g,"%d",v[L][C]);
return ;}
}
}
p++;
}
}
int main(){
fscanf(f,"%d %d %d",&n,&m,&k);
fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
fscanf(f,"%d",&x[i][j]);
fclose(f);
p=1;
q=1;
c[1].x=x1;c[1].y=y1;
v[x1][y1]=1;
if(k==1)
caut1();
else
caut2();
fclose(f);
fclose(g);
return 0;}