# include <cstdio>
# include <deque>
using namespace std;
const char *FIN = "kdrum.in", *FOU = "kdrum.out";
const int MAX_N = 55, MAX_D = 101, MAX_K = 12005;
const int dx[] = {1, 0, -1, 0}, dy[] = {0, 1, 0, -1};
int N, M, K, X1, Y1, X2, Y2;
int div[MAX_D], pz[MAX_K], A[MAX_N][MAX_N], dp[MAX_N][MAX_N][MAX_D];
struct vec {
int x, y, nr;
vec () {};
vec (int xx, int yy, int nrnr) {
x = xx, y = yy, nr = nrnr;
}
} ;
deque <vec> Q;
int cmmdc (int A, int B) {
return (B ? cmmdc (B, A % B) : A);
}
int main (void) {
freopen (FIN, "r", stdin);
scanf ("%d %d %d", &N, &M, &K);
for (int i = 1; i <= K; ++i)
if (K % i == 0)
div[pz[i] = ++pz[0]] = i;
scanf ("%d %d %d %d", &X1, &Y1, &X2, &Y2);
for (int i = 1; i <= N; ++i)
for (int j = 1; j <= M; ++j)
scanf ("%d", A[i] + j);
dp[X1][Y1][pz[K / cmmdc (K, A[X1][Y1])]] = 1;
for (Q.push_back (vec (X1, Y1, pz[K / cmmdc (K, A[X1][Y1])])); ! Q.empty (); Q.pop_front ()) {
vec rec = Q.front ();
for (int k = 0; k < 4; ++k) {
vec act = rec;
act.x += dx[k], act.y += dy[k];
if (act.x > 0 && act.x <= N && act.y > 0 && act.y <= M && A[act.x][act.y]) {
act.nr = pz[div[rec.nr]] / cmmdc (A[act.x][act.y], div[rec.nr]);
if (dp[rec.x][rec.y][rec.nr] + 1 < dp[act.x][act.y][act.nr] || dp[act.x][act.y][act.nr] == 0) {
dp[act.x][act.y][act.nr] = dp[rec.x][rec.y][rec.nr] + 1;
Q.push_back (act);
}
}
}
}
fprintf (fopen (FOU, "w"), "%d", dp[X2][Y2][1]);
}