#include<stdio.h>
#include<map>
#include<vector>
#define pb push_back
#define mkp make_pair
using namespace std;
const int maxn = 60;
const int maxst = 450000;
const int X[5] = {0,1,0,-1};
const int Y[5] = {1,0,-1,0};
pair<pair<int,int>,int> ST[maxst];
int NRSTIVA,NRST,N,M,K,XST,YST,XFIN,YFIN;
int MAT[maxn][maxn],PUT[maxn][maxn][maxn],DI[maxn][maxn][200];
map <vector<int>,int > MA1;
map <int,vector<int> > MA;
vector<int> VECT;
void scade(int x,int y,vector<int> &aux)
{
for(unsigned int i = 0;i < aux.size(); ++i)
aux[i] -= PUT[x][y][i];
for(unsigned int i = 0;i < aux.size(); ++i)
aux[i] = max(aux[i],0);
}
int main()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d %d %d\n",&N,&M,&K);
scanf("%d %d %d %d\n",&XST,&YST,&XFIN,&YFIN);
for(int i = 1;i <= N; ++i)
for(int j = 1;j <= M; ++j)
scanf("%d",&MAT[i][j]);
int aux = K;
for(int i = 2;i <= aux; ++i)
{
if (aux % i == 0)
{
int cur = 0;
while(aux % i == 0) {aux /= i;++cur;}
VECT.pb(cur);
for(int k = 1;k <= N; ++k)
for(int j = 1;j <= M; ++j)
{
int aux = MAT[k][j];
while(aux % i == 0 && aux > 0)
{
PUT[k][j][VECT.size() - 1]++;
aux /= i;
}
PUT[k][j][VECT.size() - 1] = min(cur,PUT[k][j][VECT.size() - 1]);
}
VECT[VECT.size() - 1] -= PUT[XST][YST][VECT.size() - 1];
VECT[VECT.size() - 1] = max(VECT[VECT.size() - 1],0);
}
}
DI[XST][YST][1] = 1;
MA[++NRST] = VECT;
MA1[VECT] = NRST;
ST[++NRSTIVA] = mkp(mkp(XST,YST),NRST);
for(int i = 1;i <= NRSTIVA; ++i)
{
int x = ST[i].first.first;
int y = ST[i].first.second;
int st = ST[i].second;
for(int k = 0;k <= 3; ++k)
{
int x1 = x + X[k],y1 = y + Y[k];
if (x1 < 1 || x1 > N || y1 < 1 || y1 > M || MAT[x1][y1] == 0) continue;
vector<int> aux = MA[st];
scade(x1,y1,aux);
if (MA1.find(aux) == MA1.end())
{
MA[++NRST] = aux;
MA1[aux] = NRST;
}
int stnou = MA1[aux];
if (DI[x1][y1][stnou] == 0)
{
DI[x1][y1][stnou] = DI[x][y][st] + 1;
ST[++NRSTIVA] = mkp(mkp(x1,y1),stnou);
}
}
}
vector<int> ans;
for(unsigned int i = 0;i < VECT.size(); ++i)
ans.pb(0);
int st = MA1[ans];
printf("%d\n",DI[XFIN][YFIN][st]);
return 0;
}