#include<stdio.h>
#define ll long long
#define INF 2000000000
int n,m,k,div;
int x1,y1,x2,y2;
int ord[12008];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int dist[61][61][101];
int a[61][61];
struct point
{
int x,y,z;
};
point q[300005];
int cmmdc(ll a,ll b)
{ return b ? cmmdc(b,a%b) : a; }
int main ()
{
int i,j,z,px,py,sx,sy,inc,sf,SD,D;
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]);
div=0;
for(i=1;i<=k;i++)
if(!(k%i))
ord[i]=++div;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
for(z=1;z<=div;z++)
dist[i][j][z]=INF;
q[1].x=x1,q[1].y=y1,q[1].z=1;
inc=sf=1;dist[x1][y1][1]=1;
while(inc<=sf)
{
px=q[inc].x;
py=q[inc].y;
D=q[inc].z;
for(i=0;i<4;i++)
{
sx=px+dx[i];
sy=py+dy[i];
if(sx<1 || sx>n || sy<1 || sy>m || !a[sx][sy])
continue;
SD=cmmdc((ll)k,(ll)D*a[sx][sy]);
if(dist[px][py][ord[D]] + 1 < dist[sx][sy][ord[SD]])
{
dist[sx][sy][ord[SD]]=dist[px][py][ord[D]] + 1;
q[++sf].x=sx;
q[sf].y=sy;
q[sf].z=SD;
if(sx==x2 && sy==y2 && SD==k)
{
printf("%d\n",dist[sx][sy][ord[k]]);
return 0;
}
}
}
inc++;
}
return 0;
}