using namespace std;
#include<cstdio>
#include<queue>
#define mk make_pair
#define s second
#define f first
int N,M,K,x1,x2,y1,y2;
int dv[200],div_len, poz[12002];
int a[52][52], d[52][52][200];
queue<pair<pair<int,int>,int> >Q;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
inline int cmmdc(int a, int b)
{
int r = a%b;
while(r)
{
a=b;
b=r;
r = a%b;
}
return b;
}
int main()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d%d%d%d%d%d%d",&N,&M,&K,&x1,&y1,&x2,&y2);
int i,j,x,y,z,nx,ny,t;
for(i=1;i<=N;++i)
for(j=1;j<=M;++j)
scanf("%d",&a[i][j]);
for(i=1;i<=K;++i)
if(K%i == 0)
{
dv[++div_len] = i;
poz[i] = div_len;
}
Q.push(mk(mk(x1,y1), poz[cmmdc(K, a[x1][y1])]));
d[x1][y1][Q.front().s] = 1;
for(;!Q.empty();Q.pop())
{
x = Q.front().f.f; y = Q.front().f.s; z = Q.front().s;
for(i=0;i<4;++i)
{
nx = x + dx[i]; ny = y + dy[i];
if(nx < 1 || nx > N || ny<1 || ny>M || !a[nx][ny]) continue;
t = poz[ cmmdc(K, a[nx][ny] * dv[z]) ];
if(!d[nx][ny][t] || d[x][y][z] + 1 < d[nx][ny][t])
{
d[nx][ny][t] = d[x][y][z] + 1;
Q.push(mk(mk(nx,ny),t));
}
}
}
printf("%d\n",d[x2][y2][div_len]);
return 0;
}