#include"bits/stdc++.h"
using namespace std;
using ll=long long;
#define S second
#define F first
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};
const int mxn=1005;
vector<pair<int,int>>v[mxn][mxn];
pair<int,int>p[mxn][mxn];
int sz[mxn][mxn];
char g[mxn][mxn];
pair<int,int>fp(pair<int,int>i){
if(p[i.F][i.S]==i)return i;
return p[i.F][i.S]=fp(p[i.F][i.S]);
}
void mrg(pair<int,int>a,pair<int,int>b,bool t){
bool swp=0;
a=fp(a),b=fp(b);
if(a==b)return;
if(sz[a.F][a.S]>sz[b.F][b.S])swap(a,b),swp=1;
// if(t)cout<<
for(auto i:v[b.F][b.S])v[a.F][a.S].push_back(i);
sz[a.F][a.S]+=sz[b.F][b.S];
p[b.F][b.S]=a;
}
int main(){
cin.tie(0)->sync_with_stdio(0);
int n,m;
cin>>n>>m;
int no=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>g[i][j];
if(g[i][j]!='*')no++;
p[i][j]={i,j};
sz[i][j]=1;
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
if(g[i][j]=='*')continue;
for(int d=0;d<4;d++){
int ni=i+dx[d];
int nj=j+dy[d];
if(ni>=n||ni<0||nj>=m||nj<0||g[ni][nj]=='*')continue;
if(g[ni][nj]==g[i][j])mrg({i,j},{ni,nj},0);
else v[fp({i,j}).F][fp({i,j}).S].push_back({ni,nj});
}
}
}
// cout<<endl<<endl;
// auto a=v[fp({0,0}).F][fp({0,0}).S];
// for(auto i:a){
// cout<<i.F<<' '<<i.S<<'\n';
// }
if(sz[fp({0,0}).F][fp({0,0}).S]==no) {
cout << 1; return 0;
}
for(int ans=1;ans<=n*m;ans++){
// cout<<ans<<'\n';
auto a=v[fp({0,0}).F][fp({0,0}).S];
v[fp({0,0}).F][fp({0,0}).S].clear();
for(auto i:a){
mrg({0,0},i,1);
// cout<<i.F<<' '<<i.S<<'\n';
}
// cout<<endl;
if(sz[fp({0,0}).F][fp({0,0}).S]==no)return cout<<ans+1,0;
}
}