Olya loves energy drinks. She loves them so much that her room is full of empty cans from energy drinks.

Formally, her room can be represented as a field of *n* × *m* cells, each cell of which is empty or littered with cans.

Olya drank a lot of energy drink, so now she can run *k* meters per second. Each second she chooses one of the four directions (up, down, left or right) and runs from 1 to *k* meters in this direction. Of course, she can only run through empty cells.

Now Olya needs to get from cell (*x*<sub class="lower-index">1</sub>, *y*<sub class="lower-index">1</sub>) to cell (*x*<sub class="lower-index">2</sub>, *y*<sub class="lower-index">2</sub>). How many seconds will it take her if she moves optimally?

It's guaranteed that cells (*x*<sub class="lower-index">1</sub>, *y*<sub class="lower-index">1</sub>) and (*x*<sub class="lower-index">2</sub>, *y*<sub class="lower-index">2</sub>) are empty. These cells can coincide.
The first line contains three integers *n*, *m* and *k* (1 ≤ *n*, *m*, *k* ≤ 1000) — the sizes of the room and Olya's speed.

Then *n* lines follow containing *m* characters each, the *i*-th of them contains on *j*-th position "#", if the cell (*i*, *j*) is littered with cans, and "." otherwise.

The last line contains four integers *x*<sub class="lower-index">1</sub>, *y*<sub class="lower-index">1</sub>, *x*<sub class="lower-index">2</sub>, *y*<sub class="lower-index">2</sub> (1 ≤ *x*<sub class="lower-index">1</sub>, *x*<sub class="lower-index">2</sub> ≤ *n*, 1 ≤ *y*<sub class="lower-index">1</sub>, *y*<sub class="lower-index">2</sub> ≤ *m*) — the coordinates of the first and the last cells.
In the first sample Olya should run 3 meters to the right in the first second, 2 meters down in the second second and 3 meters to the left in the third second.

In second sample Olya should run to the right for 3 seconds, then down for 2 seconds and then to the left for 3 seconds.

Olya does not recommend drinking energy drinks and generally believes that this is bad.
3 4 4
....
###.
....
1 1 3 1
3
3 4 1
....
###.
....
1 1 3 1
8
2 2 1
.#
#.
1 1 2 2
-1
10 10 1
##########
#.........
#.#######.
#.#.....#.
#.#.###.#.
#.#.#.#.#.
#.#.#.#.#.
#.#.#...#.
#.#.#####.
#.#.......
6 6 10 2
48
10 10 3
##########
##########
##########
##########
##########
##########
##########
#########.
#########.
####..###.
10 6 10 5
1
10 10 3
...##..#..
#.#..#...#
..#.##.#..
##..#..#.#
..#...##..
.#.#.#....
#......#..
.#.####.##
......#...
.#.##...##
4 6 8 1
7
10 10 1000
..........
..........
..........
..........
..........
..........
..........
..........
..........
..........
7 6 1 3
2
10 10 1000
..........
..........
..........
..........
..........
..........
..........
..........
..........
.....#....
3 9 5 1
2
10 10 10
...#......
##.#.#####
...#...###
.#####.###
...#...###
##.#.#####
...#...###
.#####.###
.......###
##########
1 1 1 10
17
2 5 5
#####
##.##
2 3 2 3
0
4 4 4
...#
.#.#
....
##..
1 1 3 4
2
6 6 100
....##
.##.##
.##.##
......
###.##
###.##
1 1 4 6
2

# -*- coding: utf-8 -*-

import math
import collections
import bisect
import heapq
import time
import random
import itertools
import sys

"""
created by shhuan at 2017/10/30 16:51

"""


N, M, K = map(int, input().split())

R = []
for i in range(N):
    R.append([0 if x == '#' else 1 for x in list(input())])

x1, y1, x2, y2 = map(int, input().split())
#
#
# M, N, K = 1000, 1000, 1000
# R = []
# for i in range(N):
#     R.append([1 if random.randint(1, 10) > 2 else 0 for _ in range(M)])
#
# x1, y1, x2, y2 = random.randint(1, M+1), random.randint(1, N+1), random.randint(1, M+1), random.randint(1, N+1),

# t0 = time.time()

x1 -= 1
y1 -= 1
x2 -= 1
y2 -= 1

q = collections.deque()
q.append((x1, y1))

vis = [[0 for _ in range(M)] for _ in range(N)]
vis[x1][y1] = 1

novisrow = {}
noviscol = {}

for r in range(N):
    novisrow[r] = {c for c in range(M) if R[r][c]}
for c in range(M):
    noviscol[c] = {r for r in range(N) if R[r][c]}


while q:
    if vis[x2][y2] > 0:
        print(vis[x2][y2]-1)
        exit(0)

    x, y = q.popleft()

    visrow = set()
    if y-1 in novisrow[x]:
        for c in sorted([c for c in novisrow[x] if 0 < y-c <= K], reverse=True):
            if not R[x][c]:
                break
            if vis[x][c] == 0:
                vis[x][c] = vis[x][y] + 1
                q.append((x, c))
                visrow.add(c)
    if y+1 in novisrow[x]:
        for c in sorted([c for c in novisrow[x] if 0 < c-y <= K]):
            if not R[x][c]:
                break
            if vis[x][c] == 0:
                vis[x][c] = vis[x][y] + 1
                q.append((x, c))
                visrow.add(c)
    novisrow[x] -= visrow

    viscol = set()
    if x-1 in noviscol[y]:
        for r in sorted([r for r in noviscol[y] if 0<=x-r<=K], reverse=True):
            if not R[r][y]:
                break
            if vis[r][y] == 0:
                vis[r][y] = vis[x][y] + 1
                q.append((r, y))
                viscol.add(r)
    if x+1 in noviscol[y]:
        for r in sorted([r for r in noviscol[y] if 0<=r-x<=K]):
            if not R[r][y]:
                break
            if vis[r][y] == 0:
                vis[r][y] = vis[x][y] + 1
                q.append((r, y))
                viscol.add(r)
    noviscol[y] -= viscol

print(-1)