```go
package main
import (
"fmt"
)
type Block struct {
minR, maxR, minC, maxC int
color byte
}
type State struct {
block int
dp int
cp int
}
func main() {
var m, n int
if _, err := fmt.Scan(&m, &n); err != nil {
return
}
grid := make([]string, m)
for i := 0; i < m; i++ {
fmt.Scan(&grid[i])
}
w := len(grid[0])
blockID := make([][]int, m)
for i := range blockID {
blockID[i] = make([]int, w)
}
blocks := []Block{{}}
id := 1
for r := 0; r < m; r++ {
for c := 0; c < w; c++ {
if grid[r][c] != '0' && blockID[r][c] == 0 {
maxC := c
for maxC < w && grid[r][maxC] == grid[r][c] && blockID[r][maxC] == 0 {
maxC++
}
maxC--
maxR := r
for maxR < m {
allSame := true
for cc := c; cc <= maxC; cc++ {
if grid[maxR][cc] != grid[r][c] || blockID[maxR][cc] != 0 {
allSame = false
break
}
}
if !allSame {
break
}
maxR++
}
maxR--
for rr := r; rr <= maxR; rr++ {
for cc := c; cc <= maxC; cc++ {
blockID[rr][cc] = id
}
}
blocks = append(blocks, Block{
minR: r, maxR: maxR, minC: c, maxC: maxC, color: grid[r][c],
})
id++
}
}
}
dr := []int{0, 1, 0, -1}
dc := []int{1, 0, -1, 0}
state := State{block: 1, dp: 0, cp: 0}
seen := make(map[State]int)
history := []State{state}
for i := 0; i < n; i++ {
if prevI, exists := seen[state]; exists {
cycleLen := i - prevI
rem := (n - i) % cycleLen
state = history[prevI+rem]
break
}
seen[state] = i
b := blocks[state.block]
var r, c int
if state.dp == 0 {
c = b.maxC
if state.cp == 0 {
r = b.minR
} else {
r = b.maxR
}
} else if state.dp == 1 {
r = b.maxR
if state.cp == 0 {
c = b.maxC
} else {
c = b.minC
}
} else if state.dp == 2 {
c = b.minC
if state.cp == 0 {
r = b.maxR
} else {
r = b.minR
}
} else if state.dp == 3 {
r = b.minR
if state.cp == 0 {
c = b.minC
} else {
c = b.maxC
}
}
nr, nc := r+dr[state.dp], c+dc[state.dp]
var nextState State
if nr >= 0 && nr < m && nc >= 0 && nc < w && grid[nr][nc] != '0' {
nextState = State{block: blockID[nr][nc], dp: state.dp, cp: state.cp}
} else {
ncp := state.cp
ndp := state.dp
if state.cp == 0 {
ncp = 1
} else {
ncp = 0
ndp = (state.dp + 1) % 4
}
nextState = State{block: state.block, dp: ndp, cp: ncp}
}
history = append(history, nextState)
state = nextState
}
fmt.Printf("%c\n", blocks[state.block].color)
}
```