#include <stdio.h>
#include <string.h>
#include <math.h>
#define Nmax 70
#define Inf 0x3f3f3f3f
int dl[]={-1,0,+1,0};
int dc[]={0,+1,0,-1};
int N,M,K;
int X1,Y1,X2,Y2;
int i,j,lne,cne;
int D[Nmax][Nmax][Nmax];
int lee1,lee2,x,k;
int l,c;
int pozd[20*Nmax];
int nrd,diviz[10*Nmax];
int w,qq;
int s[Nmax][Nmax][Nmax];
int A[Nmax][Nmax];
struct drum
{
int c,l,d;
}
q[7*Nmax];
void divizori(int x)
{
for (i=1;i<=x;++i)
if (x%i==0)
{
diviz[++nrd]=i;
pozd[i]=nrd;
}
}
void read_data()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d %d %d", &N,&M,&K);
scanf("%d %d %d %d", &X1,&Y1,&X2,&Y2);
divizori(K);
for (i=0;i<N;++i)
for (j=0;j<M;++j)
{
scanf("%d",&x);
A[i][j]=x;
}
X1--;
X2--;
Y1--;
Y2--;
}
int posibil(int X, int Y)
{
return (X>=0 && X<=N && Y>=0 && Y<=M);
}
int cmmdc(int a, int b)
{
int r;
while(b)
{
r=a%b;
a=b;
b=r;
}
return a;
}
void lee()
{
memset(D,0,sizeof(D));
lee1=1;
lee2=1;
q[lee1].l=X1;
q[lee1].c=Y1;
q[lee1].d=pozd[K/cmmdc(A[X1][Y1],K)];
D[X1][Y1][q[lee1].d]=1;
while (lee1<=lee2)
{
l=q[lee1].l;
c=q[lee1].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=diviz[q[lee1].d]/cmmdc(A[lne][cne],diviz[q[lne].d]);
w=D[q[lee1].l][q[lee1].c][q[lee1].d]+1;
if(D[lne][cne][pozd[qq]]>w || D[lne][cne][pozd[qq]]!=0)
{
D[lne][cne][pozd[qq]]=w;
lee2++;
q[lee2].l=lne;
q[lee2].c=cne;
q[lee2].d=pozd[qq];
}
}
}
}
lee1++;
}
}
void solve()
{
lee();
//if (K==1)
// printf("%d", D[X2][Y2]+1);
printf("%d\n", D[X2][Y2][pozd[1]]);
}
int main()
{
read_data();
solve();
return 0;
}