#include<stdio.h>
#define INF 1<<30
#include<string.h>
#include<algorithm>
using namespace std;
int c2[3][55*55],viz2[55][55],q,sol,k,i,j,n,m,a[55][55],viz[55][55],c[4][55*55],p,u,x1,x2,y1,y2,x,y;
int d[2][4]={{1,0,-1,0},{0,1,0,-1}};
//int cd[1000001];
int unu(int x1,int y1){
int p,u,i;
p=1;
u=1;
c2[0][p] = x1;
c2[1][p] = y1;
c2[2][p] = 1;
for(i=1;i<=n;i++)
memset(viz2[i],0,sizeof(viz2[i]));
viz2[x1][y1] = 1;
while(p <= u){
for(i=0; i<=3; i++){
x = c2[0][p] + d[0][i];
y = c2[1][p] + d[1][i];
if( x>0 && y>0 && x<=n && y<=m && a[x][y] && ! viz2[x][y]){
viz2[x][y] = 1;
u++;
c2[0][u] = x;
c2[1][u] = y;
c2[2][u] = c2[2][p] + 1;
if(x == x2 && y == y2)
return c2[2][u];
}
}
p++;
}
return 0;
}
int cmmdc(int a,int b){
int r;
while(b){
r=a%b;
a=b;
b=r;
}
return a;
}
int doi(){
int p,u,i,rez = INF;
p=1;
u=1;
c[0][p] = x1;
c[1][p] = y1;
c[2][p] = 1;
c[3][p] = k / cmmdc(a[x1][y1],k);
viz[x1][y1] = 1;
while(p <= u){
for(i=0; i<=3; i++){
x = c[0][p] + d[0][i];
y = c[1][p] + d[1][i];
if( x>0 && y>0 && x<=n && y<=m && a[x][y] && ! viz[x][y]){
viz[x][y] = 1;
u++;
c[0][u] = x;
c[1][u] = y;
c[2][u] = c[2][p] + 1;
c[3][u] = c[3][p] / cmmdc(a[x][y],c[3][p]);
if(c[3][u] == 1){
q=unu(c[0][u],c[1][u]);
if(q + c[2][u] - 1 < rez)
rez=q + c[2][u] - 1;
u--;
}
}
}
p++;
}
return rez;
}
int main(){
FILE *f=fopen("kdrum.in","r");
FILE *g=fopen("kdrum.out","w");
fscanf(f,"%d %d",&n,&m);
fscanf(f,"%d",&k);
fscanf(f,"%d %d %d %d",&x1,&y1,&x2,&y2);
for(i=1; i<=n; i++){
for(j=1; j<=m; j++)
fscanf(f,"%d",&a[i][j]);
//if(a[i][j] > vmax)
//vmax=a[i][j];
}
if(k == 1){
sol = unu(x1,y1);
}
else{
//for(i=1; i<=vmax; i++)
//cd[i] = cmmdc(i,k);
sol = doi();
}
fprintf(g,"%d",sol);
fclose(f);
fclose(g);
return 0;
}