#include <cstdio>
#include <cstring>
#define MAXN 50
#define MAXP 5
#define MAXH 100
#define MAXQ 250000
int n, m;
int p[MAXP], np[MAXP], dp;
int ma[MAXN][MAXN][MAXP], xma[MAXN][MAXN];
int d[MAXN][MAXN][MAXH];
int q1[MAXQ], q2[MAXQ], q3[MAXQ], sq, dq;
char on[MAXN][MAXN][MAXH];
int cd[4][2] = {{0, 1},{1, 0},{0, -1},{-1, 0}};
inline int vtn(int *v){
int i, h = 0;
for(i = 0; i < dp; i++){
h = h * np[i] + v[i];
}
return h;
}
inline void ntv(int h, int *v){
int i;
for(i = dp - 1; i >= 0; i--){
v[i] = h % np[i];
h /= np[i];
}
}
inline int ntn(int h, int *v){
int w[MAXP], i;
memset(w, 0, sizeof w);
ntv(h, w);
for(i = 0; i < dp; i++){
w[i] -= v[i];
if(w[i] < 0)
w[i] = 0;
}
return vtn(w);
}
inline void bell(int xs, int ys, int xf, int yf){
sq = dq = 0;
q1[dq] = xs; q2[dq] = ys; q3[dq++] = vtn(np);
memset(d, -1, sizeof d);
d[xs][ys][vtn(np)] = 1;
int x, y, h, i, cx, cy, ch;
while(sq != dq){
x = q1[sq]; y = q2[sq]; h = q3[sq];
sq++;
if(sq == MAXQ)
sq = 0;
on[x][y][h] = 0;
for(i = 0; i < 4; i++){
cx = x + cd[i][0];
cy = y + cd[i][1];
if(cx >= 0 && cx < n && cy >= 0 && cy < m && xma[cx][cy] != 0){
ch = ntn(h, ma[cx][cy]);
if(d[cx][cy][ch] == -1 || d[cx][cy][ch] > d[x][y][h] + 1){
d[cx][cy][ch] = d[x][y][h] + 1;
if(!on[cx][cy][ch]){
q1[dq] = cx; q2[dq] = cy; q3[dq++] = ch;
on[cx][cy][ch] = 1;
}
}
}
}
}
}
int main(){
freopen("kdrum.in", "r", stdin);
freopen("kdrum.out", "w", stdout);
int k, i, j, ii;
int xs, ys, xf, yf, x;
scanf("%d%d%d", &n, &m, &k);
scanf("%d%d%d%d", &xs, &ys, &xf, &yf);
xs--; ys--; xf--; yf--;
for(i = 2; i * i <= k; i++){
if(k % i == 0){
p[dp] = i;
while(k % i == 0){
k /= i;
np[dp]++;
}
dp++;
}
}
if(k > 1){
p[dp] = k;
np[dp] = 1;
dp++;
}
for(i = 0; i < n; i++){
for(j = 0; j < m; j++){
scanf("%d", &xma[i][j]);
for(ii = 0; ii < dp; ii++){
while(xma[i][j] != 0 && xma[i][j] % p[ii] == 0){
ma[i][j][ii]++;
xma[i][j] /= p[ii];
}
}
}
}
bell(xs, ys, xf, yf);
printf("%d", d[xf][yf][0]);
return 0;
}