/*
~Keep It Simple!~
*/
#include<stdio.h>
#include<list>
using namespace std;
#define NMax 52
int N,M,k,x1,x2,yy1,y2,A[NMax][NMax],idx[NMax][NMax],Lmin[NMax][NMax];
int divs[6000],nrd;
list< pair<int,int> > S;
bool viz[NMax][NMax];
int xi[] = {1,0,-1,0};
int yi[] = {0,-1,0,1};
int cmmdc(int a, int b)
{
if(!b) return a;
return cmmdc(b,a%b);
}
void InitDiv()
{
for(int i = 1; i <= k/2; i++)
if( k%i == 0 )
divs[++nrd] = i;
divs[++nrd] = k;
}
void BFS()
{
S.clear();
S.push_back(make_pair(x1,yy1));
idx[x1][yy1] = cmmdc(A[x1][x2],k);
viz[x1][yy1] = 1;
int level = 0;
while(S.size())
{
pair<int,int> nod = S.front();
S.pop_front();
viz[nod.first][nod.second] = 1;
level = Lmin[nod.first][nod.second]+1;
for(int i = 0; i<4; i++)
{
if(A[nod.first+xi[i]][nod.second+yi[i]])
{
if( nod.first + xi[i] == x2 && nod.second + yi[i] == y2)
{
int x = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
if( x == k )
{
idx[nod.first+xi[i]][nod.second+yi[i]] = x;
Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
}
}
else if(!viz[nod.first+xi[i]][nod.second+yi[i]])
{
idx[nod.first+xi[i]][nod.second+yi[i]] = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
}
/* else
if( Lmin[nod.first+xi[i]][nod.second+yi[i]] > level )
{
idx[nod.first+xi[i]][nod.second+yi[i]] = cmmdc(idx[nod.first][nod.second] * A[nod.first+xi[i]][nod.second+yi[i]],k);
Lmin[nod.first+xi[i]][nod.second+yi[i]] = level;
S.push_back(make_pair(nod.first+xi[i],nod.second+yi[i]));
}
*/
}
}
}
}
int main()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d%d%d",&N,&M,&k);
scanf("%d%d%d%d",&x1,&yy1,&x2,&y2);
for(int i = 1; i <= N; i++)
for(int j = 1; j <= M; j++)
scanf("%d",&A[i][j]);
InitDiv();
BFS();
printf("%d",Lmin[x2][y2]+1);
}