let p = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r,c) = (p[0],p[1])
let d = [(0,1),(0,-1),(1,0),(-1,0)]
var arr = [[Int]]()
var result = 0
for _ in 0..<r {
arr.append(readLine()!.map{Int($0.asciiValue!)-65})
}
dfs(0, 0, 1, 1 << arr[0][0])
print(result)
func dfs(_ x:Int,_ y:Int,_ digit:Int,_ bit:Int) {
result = result > digit ? result : digit
for (dx,dy) in d {
let (nx, ny) = (dx+x, dy+y)
if 0<=nx, nx<r, 0<=ny, ny<c {
let nb = 1 << arr[nx][ny]
if nb & bit == 0 {
dfs(nx, ny, digit+1, bit | nb)
}
}
}
}
let p = readLine()!.split(separator: " ").map{Int(String($0))!}
let (r,c) = (p[0],p[1])
let d = [(0,1),(0,-1),(1,0),(-1,0)]
var visited = Array(repeating: false, count: 26)
var arr = [[Int]]()
var result = 0
for _ in 0..<r {
arr.append(readLine()!.map{Int($0.asciiValue!)-65})
}
func dfs(_ x:Int,_ y:Int,_ cnt:Int) {
if result < cnt {
result = cnt
}
for (dx,dy) in d {
let nx = dx + x
let ny = dy + y
if 0<=nx, nx<r, 0<=ny, ny<c {
if !visited[arr[nx][ny]] {
visited[arr[nx][ny]] = true
dfs(nx, ny ,cnt+1)
visited[arr[nx][ny]] = false
}
}
}
}
visited[arr[0][0]] = true
dfs(0,0,1)
print(result)