#include<cstdio>
#include<queue>
using namespace std;
int dx[]={0,0,-1,1};
int dy[]={1,-1,0,0};
struct nod { int x,y,t; };
queue < nod > q;
int n,m,k,x1,x2,ndiv,y1,y2,i,j,x,y,t,x_new,y_new,t_new;
int u[55][55][205],A[55][55],div[205],p[12100];
int gcd(int x, int y)
{
if(!y) return x;
return gcd(y, x%y);
}
bool okay(int x, int y)
{
if(x<1 || y<1 || x>n || y>m) return 0;
return 1;
}
void lee(int x1, int y1)
{
u[x1][y1][p[gcd(k,A[x1][y1])]]=1;
q.push((nod){x1, y1, p[gcd(k,A[x1][y1])]});
while(!q.empty ())
{
x=q.front().x;
y=q.front().y;
t=q.front().t;
q.pop ();
for(int it=0;it<=3;++it)
{
x_new=x+dx[it]; y_new=y+dy[it];
if(!okay(x_new,y_new) || !A[x_new][y_new]) continue;
t_new=p[gcd(A[x_new][y_new]*div[t],k)];
if(u[x_new][y_new][t_new]) continue;
u[x_new][y_new][t_new]=u[x][y][t]+1;
q.push((nod){x_new,y_new,t_new});
}
}
}
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,&y1,&x2,&y2);
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
scanf("%d",&A[i][j]);
int ndiv=0;
for(i=1;i<=k;++i)
if(!(k%i)) div[++ndiv]=i,p[i]=ndiv;
lee(x1,y1);
printf("%d\n",u[x2][y2][p[k]]);
return 0;
}