
#include<bits/stdc++.h>
using namespace std;
int r,s,t,a[30][30],b[200],maxn=-1;//R是行数S是列数
char ms[30][30];
void dfs(int i,int j) //i行j列
{
//上
if(i-1>0&&a[i-1][j]==0)
{
if(b[ms[i-1][j]]==1)//到达
{
//最大值算法
if(t>maxn) maxn=t;
}
else
{
a[i-1][j]=1;
b[ms[i-1][j]]=1;
t++;
dfs(i-1,j);
a[i-1][j]=0;
b[ms[i-1][j]]=0;
t--;
}
}
//下
if(i+1<=r&&a[i+1][j]==0)
{
if(b[ms[i+1][j]]==1)//到达
{
//最大值算法
if(t>maxn) maxn=t;
}
else
{
a[i+1][j]=1;
b[ms[i+1][j]]=1;
t++;
dfs(i+1,j);
a[i+1][j]=0;
b[ms[i+1][j]]=0;
t--;
}
}
//左
if(j-1>0&&a[i][j-1]==0)
{
if(b[ms[i][j-1]]==1)//到达
{
//最大值算法
if(t>maxn) maxn=t;
}
else
{
a[i][j-1]=1;
b[ms[i][j-1]]=1;
t++;
dfs(i,j-1);
a[i][j-1]=0;
b[ms[i][j-1]]=0;
t--;
}
}
//右
if(j+1<=s&&a[i][j+1]==0)
{
if(b[ms[i][j+1]]==1)//到达
{
//最大值算法
if(t>maxn) maxn=t;
}
else
{
a[i][j+1]=1;
b[ms[i][j+1]]=1;
t++;
dfs(i,j+1);
a[i][j+1]=0;
b[ms[i][j+1]]=0;
t--;
}
}
}
int main()//主函数
{
cin>>r>>s;
for(int i=1;i<=r;i++)
for(int j=1;j<=s;j++)
cin>>ms[i][j];
a[1][1]=1;
b[ms[1][1]]=1;
t=1;
dfs(1,1);//从1行1列开始搜
cout<<maxn;
return 0;
}