#include <cstdio>
#define VMax 1000000
#define KMax 12000
#define NMax 100
struct abc{ int x,y,z; };
abc COADA[VMax+1];
int dp[NMax+1][NMax+1][NMax+1];
int v[NMax+1][NMax+1];
int t[KMax+1];
int dirx[4]={-1,0,1,0};
int diry[4]={0,1,0,-1};
inline int gcd(int a, int b)
{
int r;
while(b) { r=a%b; a=b; b=r; }
return a;
}
int main(){
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
int i,j,k,N,M,K,x0,y0,d0,x,y,d,x1,y1,inc,sf;
scanf("%d %d %d",&N,&M,&K);
scanf("%d %d %d %d",&x0,&y0,&x1,&y1);
for(i = 1; i <= N; ++i)
for(j = 1; j <= M; ++j) scanf("%d",&v[i][j]);
for(i = j = 1; j <= K; ++j)
if( K % j == 0 ) t[j] = i++;
dp[x0][y0][ t[ gcd(v[x0][y0], K) ] ] = 1;
inc = sf = 0;
COADA[0].x = x0;
COADA[0].y = y0;
COADA[0].z = gcd(v[x0][y0], K);
while(inc <= sf)
{
x0 = COADA[inc].x;
y0 = COADA[inc].y;
d0 = COADA[inc++].z;
for(k = 0; k < 4; ++k)
{
x = x0 + dirx[k];
y = y0 + diry[k];
if( v[x][y] )
{
d = gcd(d0*v[x][y], K);
if( !dp[x][y][ t[d] ] )
{
dp[x][y][ t[d] ] = dp[x0][y0][ t[d0] ] + 1;
COADA[++sf].x = x;
COADA[sf].y = y;
COADA[sf].z = d;
}
}
}
}
printf("%d\n", dp[x1][y1][ t[K] ] );
return 0;
}