from sys import stdin
input = stdin.readline
"""
왜 시간 초과지 ? -> 어떤 부분을 고쳐야 더 빨라질까 ?
"""
dys, dxs = [-1, 1, 0, 0], [0, 0, -1, 1]
def dfs(y, x, move_cnt):
print(y, x, move_cnt)
# print("***********************")
# print(f"y = {y} / x = {x}")
# for c_y in range(r):
# for c_x in range(c):
# print(visited[c_y][c_x], end=" ")
# print()
# print("***********************")
z = zip(dys, dxs)
ret = move_cnt
for dy, dx in z:
new_y, new_x = y + dy, x + dx
# 범위를 넘지 않고, 지난 적이 없는 알파벳이라면 -> dfs() 탐색
if 0 <= new_y < r and 0 <= new_x < c:
k=alpha_map[new_y][new_x]
if not alpha_set[k]:
continue
alpha_set[k] = False
ret = max(r, dfs(new_y, new_x, move_cnt+1))
# 역순으로 돌려놓는 과정
alpha_set[k] = True # 미방문 처리
return ret
## 변수 입력 부분 ##
r, c = map(int, input().split()) # 1 <= r(행), c(열) <= 20
alpha_map = [[ord(x)-65 for x in input().strip()] for _ in range(r)] # 알파벳 보드 정보
alpha_set = [True] * 26 # 지나온 알파벳 목록
## 문제 해결 부분 ##
alpha_set[alpha_map[0][0]] = False
print(dfs(0, 0, 1))
ZnJvbSBzeXMgaW1wb3J0IHN0ZGluCgppbnB1dCA9IHN0ZGluLnJlYWRsaW5lCiIiIgrsmZwg7Iuc6rCEIOy0iOqzvOyngCA/IC0+IOyWtOuWpCDrtoDrtoTsnYQg6rOg7LOQ7JW8IOuNlCDruajrnbzsp4jquYwgPwoiIiIKCmR5cywgZHhzID0gWy0xLCAxLCAwLCAwXSwgWzAsIDAsIC0xLCAxXQoKZGVmIGRmcyh5LCB4LCBtb3ZlX2NudCk6CiAgICBwcmludCh5LCB4LCBtb3ZlX2NudCkKICAgICMgcHJpbnQoIioqKioqKioqKioqKioqKioqKioqKioqIikKICAgICMgcHJpbnQoZiJ5ID0ge3l9IC8geCA9IHt4fSIpCiAgICAjIGZvciBjX3kgaW4gcmFuZ2Uocik6CiAgICAjICAgICBmb3IgY194IGluIHJhbmdlKGMpOgogICAgIyAgICAgICAgIHByaW50KHZpc2l0ZWRbY195XVtjX3hdLCBlbmQ9IiAiKQogICAgIyAgICAgcHJpbnQoKQogICAgIyBwcmludCgiKioqKioqKioqKioqKioqKioqKioqKioiKQogICAgeiA9IHppcChkeXMsIGR4cykKICAgIHJldCA9IG1vdmVfY250CiAgICBmb3IgZHksIGR4IGluIHo6CiAgICAgICAgbmV3X3ksIG5ld194ID0geSArIGR5LCB4ICsgZHgKICAgICAgICAjIOuylOychOulvCDrhJjsp4Ag7JWK6rOgLCDsp4Drgpwg7KCB7J20IOyXhuuKlCDslYztjIzrsrPsnbTrnbzrqbQgLT4gZGZzKCkg7YOQ7IOJCiAgICAgICAgaWYgMCA8PSBuZXdfeSA8IHIgYW5kIDAgPD0gbmV3X3ggPCBjOgogICAgICAgICAgICBrPWFscGhhX21hcFtuZXdfeV1bbmV3X3hdCiAgICAgICAgICAgIGlmIG5vdCBhbHBoYV9zZXRba106CiAgICAgICAgICAgICAgICBjb250aW51ZQogICAgICAgICAgICBhbHBoYV9zZXRba10gPSBGYWxzZQogICAgICAgICAgICByZXQgPSBtYXgociwgZGZzKG5ld195LCBuZXdfeCwgbW92ZV9jbnQrMSkpCiAgICAgICAgICAgICMg7Jet7Iic7Jy866GcIOuPjOugpOuGk+uKlCDqs7zsoJUKICAgICAgICAgICAgYWxwaGFfc2V0W2tdID0gVHJ1ZSAgIyDrr7jrsKnrrLgg7LKY66asCiAgICByZXR1cm4gcmV0CgoKIyMg67OA7IiYIOyeheugpSDrtoDrtoQgIyMKciwgYyA9IG1hcChpbnQsIGlucHV0KCkuc3BsaXQoKSkgICMgMSA8PSByKO2WiSksIGMo7Je0KSA8PSAyMAphbHBoYV9tYXAgPSBbW29yZCh4KS02NSBmb3IgeCBpbiBpbnB1dCgpLnN0cmlwKCldIGZvciBfIGluIHJhbmdlKHIpXSAgIyDslYztjIzrsrMg67O065OcIOygleuztAphbHBoYV9zZXQgPSBbVHJ1ZV0gKiAyNiAgIyDsp4DrgpjsmKgg7JWM7YyM67KzIOuqqeuhnQoKIyMg66y47KCcIO2VtOqysCDrtoDrtoQgIyMKYWxwaGFfc2V0W2FscGhhX21hcFswXVswXV0gPSBGYWxzZQpwcmludChkZnMoMCwgMCwgMSkpCg==