import java.util.*

data class Pos(val x: Int, val y: Int, val dir: Int, val cost: Long)

fun main() {
    val builder = StringBuilder()

    val (h, w, kt) = readInputLine().split(" ").map { it.toInt() }

    val k = kt.toLong()

    val (y1, x1, y2, x2) = readInputLine().split(" ").map { it.toInt() - 1 }

    val map = Array(h) { readInputLine().toCharArray() }

    // 上向きから時計回りに0, 1, 2, 3
    val cost = Array(h) { Array(w) { LongArray(4) { Long.MAX_VALUE } } }

    // (x, y, 向き, コスト)
    val queue = PriorityQueue<Pos> { x, y -> x.cost.compareTo(y.cost) }

    queue.add(Pos(x1, y1, 0, 0L))
    queue.add(Pos(x1, y1, 1, 0L))
    queue.add(Pos(x1, y1, 2, 0L))
    queue.add(Pos(x1, y1, 3, 0L))

    cost[y1][x1][0] = 0L
    cost[y1][x1][1] = 0L
    cost[y1][x1][2] = 0L
    cost[y1][x1][3] = 0L

    while (queue.isNotEmpty()) {
        val pos = queue.poll()

        if (cost[pos.y][pos.x][pos.dir] != pos.cost) {
            continue
        }

        if (pos.x == x2 && pos.y == y2) {
            println((pos.cost + (k - 1L)) / k)
            return
        }

        when(pos.dir) {
            0 -> {
                if (pos.y > 0 && map[pos.y - 1][pos.x] != '@' && cost[pos.y - 1][pos.x][pos.dir] > pos.cost + 1L) {
                    cost[pos.y - 1][pos.x][pos.dir] = pos.cost + 1L
                    queue.add(Pos(pos.x, pos.y - 1, pos.dir, pos.cost + 1L))
                }
            }
            1 -> {
                if (pos.x < w - 1 && map[pos.y][pos.x + 1] != '@' && cost[pos.y][pos.x + 1][pos.dir] > pos.cost + 1L) {
                    cost[pos.y][pos.x + 1][pos.dir] = pos.cost + 1L
                    queue.add(Pos(pos.x + 1, pos.y, pos.dir, pos.cost + 1L))
                }
            }
            2 -> {
                if (pos.y < h - 1 && map[pos.y + 1][pos.x] != '@' && cost[pos.y + 1][pos.x][pos.dir] > pos.cost + 1L) {
                    cost[pos.y + 1][pos.x][pos.dir] = pos.cost + 1L
                    queue.add(Pos(pos.x, pos.y + 1, pos.dir, pos.cost + 1L))
                }
            }
            3 -> {
                if (pos.x > 0 && map[pos.y][pos.x - 1] != '@' && cost[pos.y][pos.x - 1][pos.dir] > pos.cost + 1L) {
                    cost[pos.y][pos.x - 1][pos.dir] = pos.cost + 1L
                    queue.add(Pos(pos.x - 1, pos.y, pos.dir, pos.cost + 1L))
                }
            }
        }

        for (i in 0..3) {
            if (i % 2 == pos.dir % 2) {
                continue
            }
            if (cost[pos.y][pos.x][i] > (pos.cost + k - 1) / k * k) {
                cost[pos.y][pos.x][i] = (pos.cost + k - 1) / k * k
                queue.add(Pos(pos.x, pos.y, i, (pos.cost + k - 1) / k * k))
            }
        }
    }

    println(-1)

//    print(builder.toString())
}

fun readInputLine(): String {
    return readLine()!!
}
