#include <bits/stdc++.h>
using namespace std;
#define fastio \
ios_base::sync_with_stdio(0); \
cin.tie(0); \
cout.tie(0)
typedef long long ll;
typedef pair<ll, ll> pll;
const ll MOD = 1000000007;
const ll INF = 1e18;
const ll MAX_SIZE = 55;
// 8 directions
const ll rows[] = {1, -1, 0, 0, 1, -1, 1, -1};
const ll cols[] = {0, 0, 1, -1, 1, -1, -1, 1};
char arr[MAX_SIZE][MAX_SIZE];
ll dp[MAX_SIZE][MAX_SIZE];
ll N, M;
bool isValid(ll i, ll j)
{
return ((i >= 1 and i <= N) and (j >= 1 and j <= M));
}
int main()
{
fastio;
//freopen('input.txt','r',stdin);
//freopen('output.txt','w',stdout);
ll cnt = 0;
while (true)
{
cnt++;
cin >> N >> M;
if (!N and !M)
break;
ll longest = 0;
for (int i = 1; i <= N; i++)
{
for (int j = 1; j <= M; j++)
{
dp[i][j] = -INF;
cin >> arr[i][j];
if (arr[i][j] == 'A')
dp[i][j] = 1;
}
}
for (char ch = 'A'; ch <= 'Z'; ch++)
{
for (int i = 1; i <= N; i++)
for (int j = 1; j <= M; j++)
{
if (arr[i][j] != ch)
continue;
for (int k = 0; k < 8; k++)
{
ll newX = i + rows[k];
ll newY = j + cols[k];
if (isValid(newX, newY) and (arr[newX][newY] == (ch - 1)))
{
dp[i][j] = max(dp[newX][newY] + 1, dp[i][j]);
}
}
longest = max(longest, dp[i][j]); // Line different from Wrong solution
}
}
cout << "Case " << cnt << ": " << longest << endl;
}
return 0;
}
// END OF SOURCE CODE
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIGZhc3RpbyAgICAgICAgICAgICAgICAgICAgXAogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTsgXAogICAgY2luLnRpZSgwKTsgICAgICAgICAgICAgICAgICAgXAogICAgY291dC50aWUoMCkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CmNvbnN0IGxsIE1PRCA9IDEwMDAwMDAwMDc7CmNvbnN0IGxsIElORiA9IDFlMTg7CmNvbnN0IGxsIE1BWF9TSVpFID0gNTU7CgovLyA4IGRpcmVjdGlvbnMKY29uc3QgbGwgcm93c1tdID0gezEsIC0xLCAwLCAwLCAxLCAtMSwgMSwgLTF9Owpjb25zdCBsbCBjb2xzW10gPSB7MCwgMCwgMSwgLTEsIDEsIC0xLCAtMSwgMX07CgpjaGFyIGFycltNQVhfU0laRV1bTUFYX1NJWkVdOwpsbCBkcFtNQVhfU0laRV1bTUFYX1NJWkVdOwpsbCBOLCBNOwoKYm9vbCBpc1ZhbGlkKGxsIGksIGxsIGopCnsKICAgIHJldHVybiAoKGkgPj0gMSBhbmQgaSA8PSBOKSBhbmQgKGogPj0gMSBhbmQgaiA8PSBNKSk7Cn0KCmludCBtYWluKCkKewogICAgZmFzdGlvOwogICAgLy9mcmVvcGVuKCdpbnB1dC50eHQnLCdyJyxzdGRpbik7CiAgICAvL2ZyZW9wZW4oJ291dHB1dC50eHQnLCd3JyxzdGRvdXQpOwogICAgbGwgY250ID0gMDsKICAgIHdoaWxlICh0cnVlKQogICAgewogICAgICAgIGNudCsrOwogICAgICAgIGNpbiA+PiBOID4+IE07CiAgICAgICAgaWYgKCFOIGFuZCAhTSkKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGxsIGxvbmdlc3QgPSAwOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IE47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGZvciAoaW50IGogPSAxOyBqIDw9IE07IGorKykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZHBbaV1bal0gPSAtSU5GOwogICAgICAgICAgICAgICAgY2luID4+IGFycltpXVtqXTsKCiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldW2pdID09ICdBJykKICAgICAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoY2hhciBjaCA9ICdBJzsgY2ggPD0gJ1onOyBjaCsrKQogICAgICAgIHsKICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTjsgaSsrKQogICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDE7IGogPD0gTTsgaisrKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChhcnJbaV1bal0gIT0gY2gpCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBrID0gMDsgayA8IDg7IGsrKykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxsIG5ld1ggPSBpICsgcm93c1trXTsKICAgICAgICAgICAgICAgICAgICAgICAgbGwgbmV3WSA9IGogKyBjb2xzW2tdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZChuZXdYLCBuZXdZKSBhbmQgKGFycltuZXdYXVtuZXdZXSA9PSAoY2ggLSAxKSkpIAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcFtpXVtqXSA9IG1heChkcFtuZXdYXVtuZXdZXSArIDEsIGRwW2ldW2pdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICBsb25nZXN0ID0gbWF4KGxvbmdlc3QsIGRwW2ldW2pdKTsgLy8gTGluZSBkaWZmZXJlbnQgZnJvbSBXcm9uZyBzb2x1dGlvbgogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY291dCA8PCAiQ2FzZSAiIDw8IGNudCA8PCAiOiAiIDw8IGxvbmdlc3QgPDwgZW5kbDsKICAgIH0KCiAgICByZXR1cm4gMDsKfQovLyBFTkQgT0YgU09VUkNFIENPREU=