#include <bits/stdc++.h>
using namespace std;
ifstream f ("kdrum.in");
ofstream g ("kdrum.out");
int n,m,k,xs,xf,ys,yf,ft[12005],v[12005],ta[100005],d[55][55][105],a[55][55],dx[]={-1,1,0,0},dy[]={0,0,-1,1};
struct usu
{
int x,y,k;
};
queue <usu> q;
void solve()
{
memset(d,0x3f,sizeof(d));
q.push({xs,ys,v[__gcd(k,a[xs][ys])]});
d[xs][ys][v[__gcd(k,a[xs][ys])]]=1;
while(!q.empty())
{
int x=q.front().x,y=q.front().y,w=q.front().k;
q.pop();
for(int dir=0;dir<4;++dir)
{
int l=x+dx[dir];
int c=y+dy[dir];
if(!(l&&c&&l<=n&&c<=m)||!a[l][c]) continue;
int val=a[l][c]*v[w];
val=ta[val];
val=ft[val];
if(d[l][c][val]>d[x][y][w]+1)
{
d[l][c][val]=d[x][y][w]+1;
if(l==xf&&c==yf&&val==2) return;
q.push({l,c,val});
}
}
}
}
int main()
{
f>>n>>m>>k;
f>>xs>>ys>>xf>>yf;
for(int i=1;i<=100000;++i) ta[i]=__gcd(i,k);
for(int i=1;i<=n;++i)
{
for(int j=1;j<=m;++j)
{
f>>a[i][j];
a[i][j]=ta[a[i][j]];
}
}
int usu=0;
for(int i=1;i*i<=k;++i)
{
if(k%i==0)
{
ft[i]=++usu;
v[usu]=i;
if(k/i!=i)
{
ft[k/i]=++usu;
v[usu]=k/i;
}
}
}
solve();
if(k==1) g<<d[xf][yf][1];
else g<<d[xf][yf][2];
return 0;
}