package main
import (
"fmt"
)
type State struct {
i, j int
r int // 当前计数器 mod (p-1)
steps int
}
func main() {
var n, m, p int
fmt.Scanf("%d %d %d", &n, &m, &p)
// 读取 a[i][j]
a := make([][]int, n)
for i := 0; i < n; i++ {
a[i] = make([]int, m)
for j := 0; j < m; j++ {
fmt.Scanf("%d", &a[i][j])
}
}
// 读取 b[i][j],但不需要使用
var tmp int
for i := 0; i < n; i++ {
for j := 0; j < m; j++ {
fmt.Scanf("%d", &tmp)
}
}
mod := p - 1
if mod == 0{
fmt.Println(-1)
return
}
// dist[i][j][r] 表示到达 (i,j) 且余数为 r 的最小步数
dist := make([][][]int, n)
for i:=0;i<n;i++{
dist[i]= make([][]int, m)
for j:=0;j<m;j++{
dist[i][j] = make([]int, mod)
for k:=0;k<mod;k++{
dist[i][j][k] = -1
}
}
}
direction := [][]int{{1,0},{0,-1},{-1,0},{0,1}}
queue := []State{}
startR := a[0][0] % mod
dist[0][0][startR] = 0
queue = append(queue, State{0,0,startR,0})
for len(queue) > 0{
cur := queue[0]
queue = queue[1:]
if cur.i == n-1 && cur.j == m-1 && cur.r == 0{
fmt.Println(cur.steps)
return
}
// 四个方向
for _, v := range direction {
ni, nj := cur.i + v[0], cur.j+v[1]
if ni < 0 || ni >=n || nj<0 || nj>=m {
continue
}
newR := (cur.r + a[ni][nj])%mod
if dist[ni][nj][newR] == -1{
dist[ni][nj][newR] = cur.steps +1
queue = append(queue, State{ni,nj,newR,cur.steps + 1})
}
}
}
fmt.Println(-1)
}