#include <bits/stdc++.h>
#define DEBUG(x) cerr << "DEBUG: " << x << "\n";
#define vv(x) vector<vector<x>>
using namespace std;
int h, w;
int dfs(const vv(char)& adj, vv(int)& visited, const pair<int, int>& cur_pos, int dist) {
int i = cur_pos.first, j = cur_pos.second;
char cur = adj[i][j];
char target = (((cur - 'A') + 1) % 26) + 'A';
//DEBUG("current data: " << x << y << cur)
//DEBUG("target is: " << target)
if(visited[i][j] != -1) return visited[i][j];
// step in all directions
vector<pair<int, int>> step;
step.push_back(make_pair(i+1, j));
step.push_back(make_pair(i+1, j+1));
step.push_back(make_pair(i+1, j-1));
step.push_back(make_pair(i, j+1));
step.push_back(make_pair(i, j-1));
step.push_back(make_pair(i-1, j));
step.push_back(make_pair(i-1, j+1));
step.push_back(make_pair(i-1, j-1));
int max_dist = dist;
for(const auto& pr: step) {
int ni = pr.first, nj = pr.second;
if(ni >= h || ni < 0) continue;
if(nj >= w || nj < 0) continue;
//DEBUG("current step: " << nx << ", " << ny)
if(adj[ni][nj] == target) {
int new_dist = dfs(adj, visited, pr, dist+1);
max_dist = max(max_dist, new_dist);
//DEBUG("current dist: " << dist);
}
}
visited[i][j] = max_dist;
return max_dist;
}
int solve() {
vector<vector<char>> adj (h, vector<char>(w));
vector<vector<int>> dp (h, vector<int>(w, -1));
//vector<vector<bool>> visited (h, vector<bool>(w));
vector<pair<int, int>> start_pos;
int d = 0, d_max = 0;
char t;
for(int i = 0; i < h; i++) {
for(int j = 0; j < w; j++) {
cin >> t;
adj[i][j] = t;
if(t == 'A') start_pos.push_back(make_pair(i, j));
}
}
// reuse visited array
for(const auto& pos: start_pos) {
d = dfs(adj, dp, pos, d);
d_max = max(d, d_max);
d = 0;
}
if(start_pos.size())
return d_max+1; // include source
else
return 0;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int num = 1;
cin >> h >> w;
do {
int result = solve();
cout << "Case " << num << ": " << result << "\n";
num++;
cin >> h >> w;
} while(!(h == 0 && w == 0));
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIERFQlVHKHgpIGNlcnIgPDwgIkRFQlVHOiAiIDw8IHggPDwgIlxuIjsKI2RlZmluZSB2dih4KSB2ZWN0b3I8dmVjdG9yPHg+PgoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBoLCB3OwoKaW50IGRmcyhjb25zdCB2dihjaGFyKSYgYWRqLCB2dihpbnQpJiB2aXNpdGVkLCBjb25zdCBwYWlyPGludCwgaW50PiYgY3VyX3BvcywgaW50IGRpc3QpIHsKICAgICAgICBpbnQgaSA9IGN1cl9wb3MuZmlyc3QsIGogPSBjdXJfcG9zLnNlY29uZDsKICAgICAgICBjaGFyIGN1ciA9IGFkaltpXVtqXTsKICAgICAgICBjaGFyIHRhcmdldCA9ICgoKGN1ciAtICdBJykgKyAxKSAlIDI2KSArICdBJzsKICAgICAgICAvL0RFQlVHKCJjdXJyZW50IGRhdGE6ICIgPDwgeCA8PCB5IDw8IGN1cikKICAgICAgICAvL0RFQlVHKCJ0YXJnZXQgaXM6ICIgPDwgdGFyZ2V0KQoKICAgICAgICBpZih2aXNpdGVkW2ldW2pdICE9IC0xKSByZXR1cm4gdmlzaXRlZFtpXVtqXTsKCiAgICAgICAgLy8gc3RlcCBpbiBhbGwgZGlyZWN0aW9ucwogICAgICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gc3RlcDsKICAgICAgICBzdGVwLnB1c2hfYmFjayhtYWtlX3BhaXIoaSsxLCBqKSk7CiAgICAgICAgc3RlcC5wdXNoX2JhY2sobWFrZV9wYWlyKGkrMSwgaisxKSk7CiAgICAgICAgc3RlcC5wdXNoX2JhY2sobWFrZV9wYWlyKGkrMSwgai0xKSk7CiAgICAgICAgc3RlcC5wdXNoX2JhY2sobWFrZV9wYWlyKGksIGorMSkpOwogICAgICAgIHN0ZXAucHVzaF9iYWNrKG1ha2VfcGFpcihpLCBqLTEpKTsKICAgICAgICBzdGVwLnB1c2hfYmFjayhtYWtlX3BhaXIoaS0xLCBqKSk7CiAgICAgICAgc3RlcC5wdXNoX2JhY2sobWFrZV9wYWlyKGktMSwgaisxKSk7CiAgICAgICAgc3RlcC5wdXNoX2JhY2sobWFrZV9wYWlyKGktMSwgai0xKSk7CgogICAgICAgIGludCBtYXhfZGlzdCA9IGRpc3Q7CiAgICAgICAgZm9yKGNvbnN0IGF1dG8mIHByOiBzdGVwKSB7CiAgICAgICAgICAgICAgICBpbnQgbmkgPSBwci5maXJzdCwgbmogPSBwci5zZWNvbmQ7CiAgICAgICAgICAgICAgICBpZihuaSA+PSBoIHx8IG5pIDwgMCkgY29udGludWU7CiAgICAgICAgICAgICAgICBpZihuaiA+PSB3IHx8IG5qIDwgMCkgY29udGludWU7CiAgICAgICAgICAgICAgICAvL0RFQlVHKCJjdXJyZW50IHN0ZXA6ICIgPDwgbnggPDwgIiwgIiA8PCBueSkKICAgICAgICAgICAgICAgIGlmKGFkaltuaV1bbmpdID09IHRhcmdldCkgewogICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3X2Rpc3QgPSBkZnMoYWRqLCB2aXNpdGVkLCBwciwgZGlzdCsxKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2Rpc3QgPSBtYXgobWF4X2Rpc3QsIG5ld19kaXN0KTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9ERUJVRygiY3VycmVudCBkaXN0OiAiIDw8IGRpc3QpOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2aXNpdGVkW2ldW2pdID0gbWF4X2Rpc3Q7CiAgICAgICAgcmV0dXJuIG1heF9kaXN0Owp9CgppbnQgc29sdmUoKSB7CiAgICAgICAgdmVjdG9yPHZlY3RvcjxjaGFyPj4gYWRqIChoLCB2ZWN0b3I8Y2hhcj4odykpOwogICAgICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gZHAgKGgsIHZlY3RvcjxpbnQ+KHcsIC0xKSk7CiAgICAgICAgLy92ZWN0b3I8dmVjdG9yPGJvb2w+PiB2aXNpdGVkIChoLCB2ZWN0b3I8Ym9vbD4odykpOwogICAgICAgIHZlY3RvcjxwYWlyPGludCwgaW50Pj4gc3RhcnRfcG9zOwogICAgICAgIGludCBkID0gMCwgZF9tYXggPSAwOwogICAgICAgIGNoYXIgdDsKCiAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IGg7IGkrKykgewogICAgICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHc7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBjaW4gPj4gdDsKICAgICAgICAgICAgICAgICAgICAgICAgYWRqW2ldW2pdID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYodCA9PSAnQScpIHN0YXJ0X3Bvcy5wdXNoX2JhY2sobWFrZV9wYWlyKGksIGopKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIHJldXNlIHZpc2l0ZWQgYXJyYXkKICAgICAgICBmb3IoY29uc3QgYXV0byYgcG9zOiBzdGFydF9wb3MpIHsKICAgICAgICAgICAgICAgIGQgPSBkZnMoYWRqLCBkcCwgcG9zLCBkKTsKICAgICAgICAgICAgICAgIGRfbWF4ID0gbWF4KGQsIGRfbWF4KTsKICAgICAgICAgICAgICAgIGQgPSAwOwogICAgICAgIH0KCiAgICAgICAgaWYoc3RhcnRfcG9zLnNpemUoKSkKICAgICAgICAgICAgICAgIHJldHVybiBkX21heCsxOyAgLy8gaW5jbHVkZSBzb3VyY2UKICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKfQoKaW50IG1haW4oKSB7CiAgICAgICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICAgICAgY2luLnRpZShOVUxMKTsKCiAgICAgICAgaW50IG51bSA9IDE7CiAgICAgICAgY2luID4+IGggPj4gdzsKICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc29sdmUoKTsKICAgICAgICAgICAgICAgIGNvdXQgPDwgIkNhc2UgIiA8PCBudW0gPDwgIjogIiA8PCByZXN1bHQgPDwgIlxuIjsKICAgICAgICAgICAgICAgIG51bSsrOwogICAgICAgICAgICAgICAgY2luID4+IGggPj4gdzsKICAgICAgICB9IHdoaWxlKCEoaCA9PSAwICYmIHcgPT0gMCkpOwoKICAgICAgICByZXR1cm4gMDsKfQo=