package main
import (
"fmt"
"strconv"
)
var dx = []int{0, 1, 0, -1}
var dy = []int{1, 0, -1, 0}
type Point struct {
x, y int
}
func main() {
var H, W, K int
fmt.Scan(&H, &W, &K)
s := make([]int, H*W)
var str string
for i := 0; i < H; i++ {
fmt.Scan(&str)
for j := 0; j < W; j++ {
s[i*H+j], _ = strconv.Atoi(string(str[j]))
}
}
used := make([]bool, H*W)
ans := make([]Point, 0)
for l := 0; l < 10; l++ {
for h := 0; h < H; h++ {
for w := 0; w < W; w++ {
p := h*H + w
if !used[p] && s[p] != 0 {
points := make([]Point, 0)
points = append(points, Point{w, h})
used[h*H+w] = true
x := w
y := h
for {
maxN := 0
maxX := 0
maxY := 0
for i := 0; i < 4; i++ {
nx := x + dx[i]
ny := y + dy[i]
if nx < 0 || nx >= W || ny < 0 || ny >= H {
continue
}
if !used[ny*H+nx] && s[ny*H+nx] > 0 {
if maxN < s[ny*H+nx] {
maxN = s[ny*H+nx]
maxX = nx
maxY = ny
}
}
}
if maxN > 0 {
points = append(points, Point{maxX, maxY})
used[maxY*H+maxX] = true
} else {
for _, p := range points {
used[p.y*H+p.x] = false
}
break
}
if len(points) == K {
for pi := range points {
ans = append(ans, points[pi])
used[pi] = true
}
break
}
x = maxX
y = maxY
}
}
}
}
}
// log.Println(len(ans))
fmt.Println(len(ans) / K)
for _, a := range ans {
fmt.Println(a.y+1, a.x+1)
}
}