#include<cstdio>
#include<queue>
#include<algorithm>
#define NMAX 60
#define MMAX 12005
using namespace std;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int i,j,n,m,k,P,cm,nr,la,ca,lv,cv,xi,yi,xf,yf;
int a[NMAX][NMAX],divizor[205],poz[MMAX];
short Nr[NMAX][NMAX][205];
struct element
{
int l,c,val;
};
queue <element> q;
int verif (int x, int y)
{
if (x<1 || x>n || y<1 || y>n) return 0;
else return 1;
}
int cmmdc (int a, int b)
{
int R;
while (b)
{
R=a%b;
a=b;
b=R;
}
return a;
}
int main ()
{
freopen("kdrum.in","r",stdin);
freopen("kdrum.out","w",stdout);
scanf("%d%d%d",&n,&m,&k);
scanf("%d%d%d%d",&xi,&yi,&xf,&yf);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j) scanf("%d",&a[i][j]);
for (i=1;i<=k;++i)
if (k%i==0)
{
divizor[++nr]=i;
poz[i]=nr;
}
Nr[xi][yi][cmmdc(k,a[xi][yi])]=1;
element el;
el.l=xi;
el.c=yi;
el.val=poz[cmmdc(k,a[xi][yi])];
q.push(el);
while (!q.empty())
{
el=q.front();
q.pop();
la=el.l; ca=el.c; P=el.val;
for (i=0;i<4;++i)
{
lv=la+dx[i];
cv=ca+dy[i];
if (verif(lv,cv) && a[lv][cv])
{
cm=cmmdc(a[lv][cv]*divizor[P],k);
if (! Nr[lv][cv][poz[cm]])
{
Nr[lv][cv][poz[cm]]=Nr[la][ca][P]+1;
el.l=lv; el.c=cv; el.val=poz[cm];
q.push(el);
}
}
}
}
printf("%d\n",Nr[xf][yf][poz[k]]);
return 0;
}