#include <stdio.h>
#define NMAX 55
#define LMAX 12005
#define PMAX 205
#define HMAX 500005
int n,m,k,A[NMAX][NMAX];
int x1,y1,x2,y2,B[LMAX],r,val[PMAX];
int cost[NMAX][NMAX][PMAX];
typedef struct coada{int a,b,c;};
coada Q[HMAX];
int dlin[]={0,0,-1,1};
int dcol[]={-1,1,0,0};
int cmmdc(int a,int b)
{
int r;
while(b)
{
r=a%b; a=b; b=r;
}
return a;
}
inline int ok(int x,int y)
{
return 1<=x && x<=n && 1<=y && y<=m && A[x][y]>0;
}
void solve()
{
r=0;
Q[++r].a=x1; Q[r].b=y1; Q[r].c=B[cmmdc(A[x1][y1],k)];
cost[Q[r].a][Q[r].b][Q[r].c]=1;
int i,j,st=0,dr,x,y,z;
while (1)
{
dr=r;
for (i=st+1; i<=dr; i++)
for (j=0; j<4; j++)
{
x=Q[i].a+dlin[j]; y=Q[i].b+dcol[j]; z=cmmdc(val[Q[i].c]*A[x][y],k); z=B[z];
if (ok(x,y) && !cost[x][y][z])
{
cost[x][y][z]=cost[Q[i].a][Q[i].b][Q[i].c]+1;
Q[++r].a=x; Q[r].b=y; Q[r].c=z;
}
}
st=dr;
if (dr==r)
break ;
}
}
int main()
{
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);
int i,j;
for (i=1; i<=n; i++)
for (j=1; j<=m; j++)
scanf("%d",&A[i][j]);
B[1]=++r; B[k]=++r;
val[1]=1; val[2]=k;
for (i=2; i*i<=k; i++)
if (k % i==0)
{
B[i]=++r;
val[r]=i;
if (i*i!=k)
B[k/i]=++r,val[r]=k/i;
}
solve();
printf("%d\n",cost[x2][y2][2]);
return 0;
}