#include<bits/stdc++.h>
using namespace std;

int f[2][187][186][186],n,m,a[187][187],g[2][187][186][186],x,y,F[2][187][186][186],G[2][187][186][186];
char s[190];

void upd(int &x,int y) {x=(x>y?x:y);}

void check(int xl,int xr,int yl,int yr)
{
	upd(F[y][yl][xl][xr],yr-yl+1);
	upd(f[y][yr][xl][xr],yr-yl+1);
	upd(G[y][xl][yl][yr],xr-xl+1);
	upd(g[y][xr][yl][yr],xr-xl+1);
}

int main()
{
	scanf("%d%d",&n,&m);
	for (int i=1; i<=n; i++)
	{
		scanf("%s",s);
		for (int j=0; j<m; j++) a[i][j+1]=(s[j]=='#');
	}
	for (int k=1; k<=m; k++)
		for (int i=1; i<=n; i++)
		{
			bool bo=1;
			bo&=(a[i][k]==a[i][k-1]);
			f[0][k][i][i]=(bo?f[0][k-1][i][i]:0)+1;
			for (int j=i+1; j<=n; j++)
			{
				bo&=(a[j][k]==a[j][k-1]);
				if (a[j][k]==a[j-1][k]) f[0][k][i][j]=(bo?f[0][k-1][i][j]:0)+1;
				else break;
			}
		}
	for (int k=m; k; k--)
		for (int i=1; i<=n; i++)
		{
			bool bo=1;
			bo&=(a[i][k]==a[i][k+1]);
			F[0][k][i][i]=(bo?F[0][k+1][i][i]:0)+1;
			for (int j=i+1; j<=n; j++)
			{
				bo&=(a[j][k]==a[j][k+1]);
				if (a[j][k]==a[j-1][k]) F[0][k][i][j]=(bo?F[0][k+1][i][j]:0)+1;
				else break;
			}
		}
	for (int k=1; k<=n; k++)
		for (int i=1; i<=m; i++)
		{
			bool bo=1;
			bo&=(a[k][i]==a[k-1][i]);
			g[0][k][i][i]=(bo?g[0][k-1][i][i]:0)+1;
			for (int j=i+1; j<=m; j++)
			{
				bo&=(a[k][j]==a[k-1][j]);
				if (a[k][j]==a[k][j-1]) g[0][k][i][j]=(bo?g[0][k-1][i][j]:0)+1;
				else break;
			}
		}
	for (int k=n; k; k--)
		for (int i=1; i<=m; i++)
		{
			bool bo=1;
			bo&=(a[k][i]==a[k+1][i]);
			G[0][k][i][i]=(bo?G[0][k+1][i][i]:0)+1;
			for (int j=i+1; j<=m; j++)
			{
				bo&=(a[k][j]==a[k+1][j]);
				if (a[k][j]==a[k][j-1]) G[0][k][i][j]=(bo?G[0][k+1][i][j]:0)+1;
				else break;
			}
		}
	x=1,y=0;
	for (int ans=0; ; ans++)
	{
		x^=1,y^=1;
		if (f[x][m][1][n]==m) return printf("%d\n",ans),0;
		for (int i=1; i<m; i++)
			for (int j=1; j<=n; j++)
				for (int k=j; k<=n; k++) 
					if (f[x][i][j][k]&&F[x][i+1][j][k]) check(j,k,i-f[x][i][j][k]+1,i+F[x][i+1][j][k]);
		for (int i=1; i<n; i++)
			for (int j=1; j<=m; j++)
				for (int k=j; k<=m; k++)
					if (g[x][i][j][k]&&G[x][i+1][j][k]) check(i-g[x][i][j][k]+1,i+G[x][i+1][j][k],j,k);
		for (int i=1; i<=m; i++)
			for (int j=1; j<=n; j++)
				for (int k=n; k>j; k--)
					upd(f[y][i][j+1][k],f[y][i][j][k]),
					upd(f[y][i][j][k-1],f[y][i][j][k]),
					upd(F[y][i][j+1][k],F[y][i][j][k]),
					upd(F[y][i][j][k-1],F[y][i][j][k]);
		for (int i=1; i<=n; i++)
			for (int j=1; j<=m; j++)
				for (int k=m; k>j; k--)
					upd(g[y][i][j+1][k],g[y][i][j][k]),
					upd(g[y][i][j][k-1],g[y][i][j][k]),
					upd(G[y][i][j+1][k],G[y][i][j][k]),
					upd(G[y][i][j][k-1],G[y][i][j][k]);
		for (int i=m; i>1; i--)
			for (int j=1; j<=n; j++)
				for (int k=j; k<=n; k++)
					upd(f[y][i-1][j][k],f[y][i][j][k]-1);
		for (int i=1; i<m; i++)
			for (int j=1; j<=n; j++)
				for (int k=j; k<=n; k++)
					upd(F[y][i+1][j][k],F[y][i][j][k]-1);
		for (int i=n; i>1; i--)
			for (int j=1; j<=m; j++)
				for (int k=j; k<=m; k++)
					upd(g[y][i-1][j][k],g[y][i][j][k]-1);
		for (int i=1; i<n; i++)
			for (int j=1; j<=m; j++)
				for (int k=j; k<=m; k++)
					upd(G[y][i+1][j][k],G[y][i][j][k]-1);
	}
	return 0;
}

Measured memory_bytes: 202240