#include <iostream>
#include <queue>
#include <vector>
using namespace std;

//定义状态结构体
struct state{
    int i, j, counter;
};

int main() {
    //标准竞赛输入输出优化
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    //辅助数组
    int fi[4] = {1, -1, 0, 0};
    int fj[4] = {0, 0, 1, -1};

    //输入数据
    int n, m, p;
    cin >> n >> m >> p;
    int a[n + 1][m + 1];
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= m; j++){
            cin >> a[i][j];
        }
    }
    int mod = p - 1;
    //三维状态数组,记录达到此状态的用时,初始化为-1
    vector<vector<vector<int>>> dist(n + 1, vector(m + 1, vector(mod, -1)));
    //bfs
    queue<state> q;
    q.push({1, 1,(a[1][1]) % mod});
    dist[1][1][(a[1][1]) % mod] = 0;
    while(!q.empty()){
        //终止条件
        if(dist[n][m][0] != -1){
            break;
        }
        state current = q.front();
        q.pop();
        for(int i = 0; i < 4; i++){
            if(current.i + fi[i] >= 1 && current.i + fi[i] <= n && current.j + fj[i] >= 1 && current.j + fj[i] <= m && dist[current.i + fi[i]][current.j + fj[i]][(current.counter + a[current.i + fi[i]][current.j + fj[i]]) % mod] == -1){
                q.push({current.i + fi[i],current.j + fj[i],(current.counter + a[current.i + fi[i]][current.j + fj[i]]) % mod});
                dist[current.i + fi[i]][current.j + fj[i]][(current.counter + a[current.i + fi[i]][current.j + fj[i]]) % mod] = dist[current.i][current.j][current.counter] + 1;
            }
        }
    }

    //输出结果
    cout << dist[n][m][0] << '\n';
    
    return 0;
}
// 64 位输出请用 printf("%lld")