← Home
```go
package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
	"strings"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)
	scanner.Scan()
	headers := strings.Fields(scanner.Text())
	n, _ := strconv.Atoi(headers[0])
	m, _ := strconv.Atoi(headers[1])

	grid := make([]string, n)
	for i := 0; i < n; i++ {
		scanner.Scan()
		grid[i] = scanner.Text()
	}

	var letterVal [256]int
	letterVal['D'] = 0
	letterVal['I'] = 1
	letterVal['M'] = 2
	letterVal['A'] = 3
	nextLetter := [4]int{1, 2, 3, 0}

	N := n * m
	state := make([]int8, N)
	dp := make([]int, N)
	for i := range dp {
		dp[i] = -1
	}

	dr := [4]int{-1, 1, 0, 0}
	dc := [4]int{0, 0, -1, 1}

	type Frame struct {
		id     int
		dir    int8
		maxVal int
	}

	stack := make([]Frame, 0, 1024)

	var dfs func(startID int) bool
	dfs = func(startID int) bool {
		stack = stack[:0]
		state[startID] = 1
		stack = append(stack, Frame{id: startID, dir: 0, maxVal: 0})
		for len(stack) > 0 {
			top := &stack[len(stack)-1]
			if top.dir == 4 {
				dp[top.id] = top.maxVal
				state[top.id] = 2
				stack = stack[:len(stack)-1]
				continue
			}
			r := top.id / m
			c := top.id % m
			d := top.dir
			nr := r + dr[d]
			nc := c + dc[d]
			if nr >= 0 && nr < n && nc >= 0 && nc < m {
				nid := nr*m + nc
				curLetter := letterVal[grid[r][c]]
				nextL := nextLetter[curLetter]
				nbrLetter := letterVal[grid[nr][nc]]
				if nbrLetter == nextL {
					if state[nid] == 1 {
						return true
					} else if state[nid] == 2 {
						w := 0
						if curLetter == 2 {
							w = 1
						}
						if dp[nid]+w > top.maxVal {
							top.maxVal = dp[nid] + w
						}
						top.dir++
					} else {
						state[nid] = 1
						stack = append(stack, Frame{id: nid, dir: 0, maxVal: 0})
					}
				} else {
					top.dir++
				}
			} else {
				top.dir++
			}
		}
		return false
	}

	maxAns := 0
	for r := 0; r < n; r++ {
		for c := 0; c < m; c++ {
			if grid[r][c] == 'D' {
				id := r*m + c
				if state[id] == 0 {
					if dfs(id) {
						fmt.Println("Poor Inna!")
						return
					}
				}
				if dp[id] > maxAns {
					maxAns = dp[id]
				}
			}
		}
	}

	if maxAns == 0 {
		fmt.Println("Poor Dima!")
	} else {
		fmt.Println(maxAns)
	}
}
```