//Author:PanDaoxi
#include <iostream>
using namespace std;
//map=地图
char map[30][30];
//vis=标记字母是否使用过
//r,s=矩阵的长和宽
//maxs=最大值
//cnt=每次搜索的值
int vis[30]={
},r,s,maxs=0,cnt=1;
//搜索方向:上右下左
int f[4][2]={
{
-1,0},{
0,1},{
1,0},{
0,-1}};
//深搜函数
void dfs(int x,int y){
if(cnt>maxs) maxs=cnt;
for(int i=0;i<4;i++){
int x1=x+f[i][0],y1=y+f[i][1];
//不超过边界且字母不能重复
//map[x1][y1]=储存的字母
if(x1>=1&&x1<=r&&y1>=1&&y1<=s&&vis[map[x1][y1]-'A']==0){
cnt++;
vis[map[x1][y1]-'A']=1; //标记已经使用
dfs(x1,y1);
//回溯
vis[map[x1][y1]-'A']=0;
cnt--;
}
}
}
int main(){
cin>>r>>s;
for(int i=1;i<=r;i++){
for(int j=1;j<=s;j++){
cin>>map[i][j];
}
}
vis[map[1][1]-'A']=1;
dfs(1,1);
cout<<maxs<<endl;
return 0;
}