#include<cstdio>
#include<queue>
#include<vector>
#include<cmath>
#define mk make_pair
#define f first
#define s second
FILE *f=fopen("kdrum.in","r");
FILE *g=fopen("kdrum.out","w");
using namespace std;
int dx[]={0,0,1,-1}, dy[]={1,-1,0,0};
queue < pair< pair<int,int>,int> > Q;
int poz[12002],div[200],div_len,x1,x2,y11,y2;
int a[52][52],n,m,k,d[52][52][205];
inline int cmmdc( int a, int b)
{
int r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
return b;
}
int main( void )
{
fscanf(f,"%d%d%d",&n,&m,&k);
fscanf(f,"%d%d%d%d",&x1,&x2,&y11,&y2);
for(int i(1); i <= n ;++i )
for(int ii(1) ; ii <= m ; ++ii )
fscanf(f,"%d",&a[i][ii]);
for(int i(1); i <= k ; ++i )
if( k % i == 0)
{
div[++div_len]=i;
poz[i]=div_len;
}
fclose(f);
Q.push(mk(mk(x1,y11),poz[cmmdc(k,a[x1][y11])]));
d[x1][y11][Q.front().s]=1;
for(;!Q.empty();Q.pop())
{
int x=Q.front().f.f;
int y=Q.front().f.s;
int z=Q.front().s;
for(int i(0) ; i < 4 ; ++i )
{
int xnou=x+dx[i];
int ynou=y+dy[i];
if(xnou<1 || xnou >n || ynou<1 || ynou>m || !a[xnou][ynou] ) continue;
int t=poz[cmmdc(k,div[z]*a[xnou][ynou])];
if(!d[xnou][ynou][t] || d[xnou][ynou][t] > d[x][y][z] +1 )
{
d[xnou][ynou][t]=d[x][y][z]+1;
Q.push(mk(mk(xnou,ynou),t));
}
}
}
fprintf(g,"%d",d[x2][y2][div_len]);
fclose(g);
return 0;
}