#include <bits/stdc++.h>
using namespace std;
struct dd{
int x;
int y;
int c;
};
int main() {
int n,m,p;
vector<vector<int>> fx={{0,1},{1,0},{-1,0},{0,-1}};
cin>>n>>m>>p;
vector<vector<int>> a(n,vector<int>(m));
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
for(int x,i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>x;
}
}
queue<struct dd> que;
vector<vector<vector<int>>> dit(n,vector<vector<int>>(m,vector<int>(p-1,-1)));
que.push({0,0,a[0][0]%(p-1)});
dit[0][0][a[0][0]%(p-1)]=0;
while(!que.empty()){
auto [x,y,c]=que.front();
int t=dit[x][y][c];
que.pop();
for(auto i:fx){
int xx=x+i[0],yy=y+i[1];
if(!(xx>=0&&xx<n&&yy>=0&&yy<m))continue;
int cc=(c+a[xx][yy])%(p-1);
if(dit[xx][yy][cc]==-1){
que.push({xx,yy,cc});
dit[xx][yy][cc]=t+1;
}
}
}
cout<<dit[n-1][m-1][0];
}