#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];
}