# include <cstdio>
# include <deque>
using namespace std;
const int MAX_N = 55;
const int MAX_D = 100;
const int MAX_K = 12001;
const int dx[4] = {1, 0, -1, 0};
const int dy[4] = {0, 1, 0, -1};
int n, m, k, z, dvvv;
int d[MAX_D], a[MAX_N][MAX_N], b[MAX_N][MAX_N][MAX_D], p[MAX_K];
struct vec {
int x, y, r;
vec () {};
vec (int xx, int yy, int nrnr) {
x = xx, y = yy, r = nrnr;
}
} ;
deque <vec> c;
int cmmdc (int A, int B) {
return (B ? cmmdc (B, A % B) : A);
}
int main()
{
int i, j, x1, y1, x2, y2;
freopen("kdrum.in", "r", stdin);
freopen("kdrum.out", "w", stdout);
scanf("%d%d%d", &n, &m, &k);
for (i = 1; i <= k; i++)
if (k % i == 0) d[p[i] = ++dvvv] = i;
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
for (i = 1; i <= n; i++)
for (j = 1; j <= m; scanf("%d", &a[i][j]), j++)
b[x1][y1][p[k / cmmdc(k, a[x1][y1])]] = 1;
c.push_back (vec (x1, y1, p[k / cmmdc(k, a[x1][y1])]));
/*z = 1;
c[1].x = x1;
c[1].y = y1;
c[1].r = p[k / cmmdc(k, a[x1][y1])];*/
for (; !c.empty (); c.pop_front ())
{
for (int dir = 0; dir < 4; dir++)
{
int newx = c.front ().x + dx[dir];
int newy = c.front ().y + dy[dir];
if (newx > 0 && newx <= n && newy > 0 && newy <= m && a[newx][newy] != 0)
{
int r = p[d[c.front ().r] / cmmdc(a[newx][newy], d[c.front ().r])];
if (b[c.front ().x][c.front ().y][c.front ().r] + 1 < b[newx][newy][r] || (!b[newx][newy][r]))
{
b[newx][newy][r] = b[c.front ().x][c.front ().y][c.front ().r] + 1;
c.push_back (vec (newx, newy, r));
/*c[++z].x = newx;
c[z].y = newy;
c[z].r = r;*/
}
}
}
}
printf("%d\n", b[x2][y2][1]);
}