#include <stdio.h>
long N,M,i,j,X1,X2,Y1,Y2,ql[100],qc[1500],qq,nr,le1,le2,ok,l,c,x,K,p,min;
long A[70][70];
int dl[]={-1,0,+1,0};
int dc[]={0,+1,0,-1};
long qd[100],poz[12000],div[12000],D[100][100][10],ndiv,w;
struct drum
{
int c,l,d;
}
q[12100];
int cmmdc(int a, int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
void divizori(int x)
{
for (i=1;i<=x;++i)
if (x%i==0)
{
div[++ndiv]=i;
poz[i]=ndiv;
}
}
int posibil(int X, int Y)
{
return (X>0 && X<=N && Y>0 && Y<=M);
}
void lee()
{
long l,c,lne,cne,k;
le1=1;
q[1].l=X1;
q[1].c=Y1;
/*D[X1][Y1]=0;
ql[2]=X2;
qc[2]=Y2;*/
q[1].d=poz[K/(cmmdc(K,A[X1][Y1]))];
le2=1;
D[X1][Y1][q[1].d]=1;
while (le1<=le2)
{
l=q[le1].l;
c=q[le1].c;
for (k=0;k<4;++k)
{
lne=l+dl[k];
cne=c+dc[k];
if (posibil(lne,cne))
{
if (A[lne][cne]!=0)
{
qq=div[q[le1].d]/(cmmdc(div[q[le1].d],A[lne][cne]));
if(D[lne][cne][poz[qq]]>D[q[le1].l][q[le1].c][q[le1].d]+1 || !D[lne][cne][poz[qq]])
{
D[lne][cne][poz[qq]]=D[q[le1].l][q[le1].c][q[le1].d]+1;
le2++;
q[le2].l=lne;
q[le2].c=cne;
q[le2].d=poz[qq];
}
}
}
}
le1++;
}
}
int main()
{
freopen("kdrum.in","r",stdin);
scanf("%ld %ld %ld", &N,&M,&K);
scanf("%ld %ld %ld %ld\n",&X1,&Y1,&X2,&Y2);
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
{
scanf("%ld", &A[i][j]);
//D[i][j]=666666;
}
divizori(K);
//X1--;
//Y1--;
//X2--;
//Y2--;
//A[X1][Y1]='.';
//A[X2][Y2]='.';
lee();
freopen("kdrum.out","w",stdout);
//if (K==1) printf("%ld\n", D[X2][Y2]+1);
/*else
{
min=666666;
p=1;
nr=1;
pas(X1,Y1,X2,Y2);
if (p%K==0)
if (min>nr)
min=nr;
printf("%ld\n",min);
}*/
printf("%ld",D[X2][Y2][poz[1]]);
return 0;
}