#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll MOD;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
struct status {
int x, y, r, dist;
};
void solve() {
int n, m, p; cin >> n >> m >>p;
MOD = p - 1;
vector<vector<int>> c(n + 1, vector<int>(m + 1, 0));
for(int i = 1; i <= n; i ++) for(int j = 1; j <= m; j ++) {cin >> c[i][j]; c[i][j]%=MOD;}
ll b;
for(int i = 1; i <= n; i ++) for(int j = 1; j <= m; j ++) cin >> b;
if(n == 1 && m == 1 && c[1][1] == 0) {cout << "0\n"; return;}
vector<vector<vector<int>>> vis(n + 1, vector<vector<int>>(m + 1, vector<int>(p, 0)));
queue<status> q; vis[1][1][c[1][1]] = 1;
q.push({1, 1, c[1][1], 0});
while(!q.empty()) {
auto [x, y, r, dist] = q.front(); q.pop();
//cout << "TEST " << x << " " << y <<" " << r << " " << dist << "\n";
for(int d = 0; d < 4; d ++) {
int tx = x + dx[d], ty = y + dy[d];
if(tx <= 0 || ty <= 0 || tx > n || ty > m) continue;
int res = (r + c[tx][ty]) % MOD;
if(vis[tx][ty][res]) continue;
if(tx == n && ty == m && res == 0) {cout << dist + 1 << "\n"; return; }
q.push({tx, ty, res, dist + 1});
vis[tx][ty][res] = 1;
}
}
cout << "-1\n";
}
int main() {
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
int _=1; //cin >> _;
while(_--) solve();
return 0;
}