#include <stdio.h>
int A[70][70],N,M,K,X1,X2,Y1,Y2,D[100][100][10],div[12001],poz[12001],i,j,nrd,ls,ld,ll,cc,k,lne,cne,h,g;
struct drum
{
int l,c,d;
}
q[12001];
int dl[]={0,1,0,-1};
int dc[]={-1,0,1,0};
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);
for (i=1;i<=N;++i)
for (j=1;j<=M;++j)
scanf("%d", &A[i][j]);
nrd=1;
div[1]=1;
poz[1]=1;
for (i=2;i*i<=K;++i)
{
if (K%i==0)
{
nrd++;
div[nrd]=i;
poz[i]=nrd;
}
}
nrd++;
div[nrd]=K;
poz[K]=nrd;
}
int cmmdc(int a, int b)
{
int r;
while(r)
{
r=a%b;
a=b;
b=r;
}
return a;
}
void solve()
{
ls=1;
ld=1;
q[1].l=X1;
q[1].c=Y1;
g=cmmdc(K,A[X1][Y1]);
q[1].d=poz[K/g];
D[X1][Y1][poz[K/g]]=1;
while(ls<=ld)
{
ll=q[ls].l;
cc=q[ls].c;
for (k=0;k<4;++k)
{
lne=ll+dl[k];
cne=cc+dc[k];
if (lne>0 && lne<=N && cne>0 && cne<=M && A[lne][cne]!=0)
{
h=div[q[ls].d]/cmmdc(div[q[ls].d],A[lne][cne]);
if (D[lne][cne][poz[h]]>D[q[ls].l][q[ls].c][q[ls].d]+1 || D[lne][cne][poz[q[ls].d]]==0)
{
D[lne][cne][poz[h]]=D[q[ls].l][q[ls].c][q[ls].d]+1;
ld++;
q[ld].l=lne;
q[ld].c=cne;
q[ld].d=poz[h];
}
}
}
ls++;
}
}
void write_data()
{
printf("%ld\n", D[X2][Y2][poz[1]]);
}
int main()
{
read_data();
solve();
write_data();
return 0;
}