#include<fstream>
#include<queue>
using namespace std;
const char iname[]="kdrum.in";
const char oname[]="kdrum.out";
const int maxn=57;
const int maxd=85;
const int maxk=12007;
const int INF=(1<<31)-1;
ifstream f(iname);
ofstream g(oname);
int d[maxd],a[maxn][maxn][maxd],n,i,j,k,p,b[maxn][maxn],m,r,w[maxk],x1,y1,x2,y2,dx[4]={-1,0,1,0},dy[4]={0,-1,0,1},x,y,z;
int cmmdc(int a,int b)
{
if(b==0)
return a;
return cmmdc(b,a%b);
}
struct mpair
{
int x;
int y;
int z;
mpair(int _x,int _y,int _z):x(_x),y(_y),z(_z){}
};
queue<mpair> Q;
int main()
{
f>>n>>m>>k>>x1>>y1>>x2>>y2;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
f>>b[i][j];
for(i=1;i<=k;++i)
if(k%i==0)
d[++r]=i,w[i]=r;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
for(p=1;p<=r;++p)
a[i][j][p]=INF;
for(i=1;i<=n;++i)
for(p=1;p<=r;++p)
a[i][0][p]=a[i][m+1][p]=0;
for(i=1;i<=m;++i)
for(p=1;p<=r;++p)
a[0][i][p]=a[n+1][i][p]=0;
Q.push(mpair(x1,y1,w[cmmdc(b[x1][y1],k)]));
a[x1][y1][w[cmmdc(b[x1][y1],k)]]=1;
while(!Q.empty())
{
x=Q.front().x;
y=Q.front().y;
z=Q.front().z;
Q.pop();
for(i=0;i<4;++i)
{
p=cmmdc(k,d[z]*b[x+dx[i]][y+dy[i]]);
if(b[x+dx[i]][y+dy[i]]&&a[x][y][z]+1<a[x+dx[i]][y+dy[i]][w[p]])
a[x+dx[i]][y+dy[i]][w[p]]=a[x][y][z]+1,Q.push(mpair(x+dx[i],y+dy[i],w[p]));
}
}
g<<a[x2][y2][r]<<"\n";
f.close();
g.close();
return 0;
}