#include <bits/stdc++.h>
using namespace std;
const int dmax = 105;
int gcd(int a, int b)
{
if(!b)
return a;
return gcd(b, a % b);
}
struct Cell{
int x, y, div_index;
};
int solve(const vector<vector<int>>& m, int sx, int sy, int px, int py, int k)
{
int r = m.size(), c = m[0].size();
int d[r][c][dmax];
memset(d, -1, sizeof(d));
vector<vector<int>> g(r, vector<int>(c));
for(int i = 0;i < r;++i)
for(int j = 0;j < c;++j)
g[i][j] = gcd(m[i][j], k);
int pos[k + 1];
vector<int> divs;
for(int i = 1;i <= k;++i)
{
if(k % i == 0)
{
divs.push_back(i);
pos[i] = divs.size() - 1;
}
}
queue<Cell> q;
q.push({sx, sy, pos[g[sx][sy]]});
d[sx][sy][pos[g[sx][sy]]] = 0;
int dx[] = {-1, 1, 0, 0};
int dy[] = {0, 0, -1, 1};
while(!q.empty())
{
auto it = q.front();
q.pop();
int x = it.x, y = it.y, index = it.div_index;
if(x == px && y == py && index == divs.size() - 1)
return d[x][y][index];
for(int i = 0;i < 4;++i)
{
int nx = x + dx[i], ny = y + dy[i];
if(nx >= 0 && nx < r && ny >= 0 && ny < c && m[nx][ny])
{
int divis = divs[index];
divis *= g[nx][ny];
divis = gcd(divis, k);
int nindex = pos[divis];
if(d[nx][ny][nindex] == -1)
{
d[nx][ny][nindex] = d[x][y][index] + 1;
q.push({nx, ny, nindex});
}
}
}
}
return 0;
}
int main() {
freopen("kdrum.in", "r", stdin);
freopen("kdrum.out", "w", stdout);
int r, c, k, sx, sy, dx, dy;
cin >> r >> c >> k >> sx >> sy >> dx >> dy;
--sx, --sy, --dx, --dy;
vector<vector<int>> m(r, vector<int>(c));
for(int i = 0;i < r;++i)
for(int j = 0;j < c;++j)
cin >> m[i][j];
cout << solve(m, sx, sy, dx, dy, k) + 1 << "\n";
}