#include<fstream>
#include<queue>
using namespace std;
ifstream f("kdrum.in");
ofstream g("kdrum.out");
int n,m,k,d,x1,x2,nrd,y1,y2,i,j,x,y,z,xnou,ynou,znou,viz[55][55][205],a[55][55],fact[205],p[12100];
struct nod{int x,y,z;};
queue<nod>q;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
int cmmdc(int x,int y)
{
if(y==0)
return x;
return cmmdc(y,x%y);
}
inline bool ein(int x,int y)
{
if(x<1||y<1||x>n||y>m)
return 0;
return 1;
}
int main()
{
f>>n>>m>>k>>x1>>y1>>x2>>y2;
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
f>>a[i][j];
for(i=1;i<=k;++i)
if(k%i==0)
{
++nrd;
fact[nrd]=i;
p[i]=nrd;
}
viz[x1][y1][p[cmmdc(k,a[x1][y1])]]=1;
q.push((nod){x1,y1,p[cmmdc(k,a[x1][y1])]});
while(!q.empty())
{
x=q.front().x;
y=q.front().y;
z=q.front().z;
q.pop();
for(d=0;d<=3;++d)
{
xnou=x+dx[d];
ynou=y+dy[d];
if(!ein(xnou,ynou)||!a[x][y])
continue;
znou=p[cmmdc(a[xnou][ynou]*fact[z],k)];
if(viz[xnou][ynou][znou])
continue;
viz[xnou][ynou][znou]=viz[x][y][z]+1;
q.push((nod){xnou,ynou,znou});
}
}
g<<viz[x2][y2][p[k]]<<'\n';
return 0;
}