#include <bits/stdc++.h>
#define int long long
int H, W;
std::vector<std::string> grid;
int dist[4010][4010];
int dx[4] = {1,-1,0,0};
int dy[4] = {0,0,1,-1};
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(0);
std::cin >> H >> W;
grid.resize(H+1);
for(int i=1;i<=H;i++){
std::string s;
std::cin >> s;
grid[i] = " " + s;
}
for(int i=1;i<=H;i++){
for(int j=1;j<=W;j++){
dist[i][j] = 1e9;
}
}
std::deque<std::pair<int,int>> dq;
dist[1][1] = 0;
dq.push_front({1,1});
while(!dq.empty()){
auto [x,y] = dq.front();
dq.pop_front();
for(int d=0;d<4;d++){
int nx = x + dx[d];
int ny = y + dy[d];
if(nx<1 || ny<1 || nx>H || ny>W) continue;
if(grid[nx][ny] == '.') continue;
int cost = (grid[nx][ny] != grid[x][y]);
if(dist[nx][ny] > dist[x][y] + cost){
dist[nx][ny] = dist[x][y] + cost;
if(cost == 0) dq.push_front({nx,ny});
else dq.push_back({nx,ny});
}
}
}
int ans = 0;
for(int i=1;i<=H;i++){
for(int j=1;j<=W;j++){
if(grid[i][j] != '.'){
ans = std::max(ans, dist[i][j]);
}
}
}
std::cout << ans + 1 << '\n';
}