#include <algorithm>
#include <cctype>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <functional>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>

using namespace std;

#define reps(i,f,n) for(int i=f; i<int(n); ++i)
#define rep(i,n) reps(i,0,n)

typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef pair<int, int> pii;

const int INF = 1001001001;
const double EPS = 1e-10;

const int dy[] = {-1, 0, 1, 0};
const int dx[] = {0, -1, 0, 1};

int h, w;
int board[10][10];
int label[10][10];
vi color;
vvi G;

void labeling(int y, int x, int id)
{
	label[y][x] = id;
	rep(i, 4){
		int py = y + dy[i];
		int px = x + dx[i];
		if(py<0 || h<=py || px<0 || w<=px)
			continue;
		if(board[py][px] == board[y][x] && label[py][px] == -1)
			labeling(py, px, id);
	}
}

bool dfs(vi cand, int now, int depth)
{
	if(depth == 0){
		rep(i, cand.size())
			if(cand[i] != 2)
				return false;
		return true;
	}
	
	vi tmp = cand;
	rep(c, 3){
		if(c == now)
			continue;
		
		bool found = false;
		rep(i, cand.size()){
			if(cand[i]==1 && color[i]==c){
				rep(j, G[i].size()){
					if(cand[G[i][j]] == 0)
						cand[G[i][j]] = 1;
				}
				cand[i] = 2;
				found = true;
			}
		}
		if(found){
			if(dfs(cand, c, depth-1))
				return true;
			cand = tmp;
		}
	}
	return false;
}

int main()
{
	while(scanf("%d%d", &w, &h), w){
		rep(i, h) rep(j, w){
			char c[5];
			scanf("%s", c);
			if(c[0] == 'R')
				board[i][j] = 0;
			else if(c[0] == 'G')
				board[i][j] = 1;
			else
				board[i][j] = 2;
		}

		rep(i, h)
			fill(label[i], label[i]+w, -1);

		color.clear();
		rep(i, h) rep(j, w){
			if(label[i][j] == -1){
				labeling(i, j, color.size());
				color.push_back(board[i][j]);
			}
		}

		G.assign(color.size(), vi());
		rep(i, h) rep(j, w){
			rep(k, 4){
				int py = i + dy[k];
				int px = j + dx[k];
				if(py<0 || h<=py || px<0 || w<=px)
					continue;
				if(label[i][j] != label[py][px]){
					G[label[i][j]].push_back(label[py][px]);
					G[label[py][px]].push_back(label[i][j]);
				}
			}
		}

		rep(i, G.size()){
			sort(G[i].begin(), G[i].end());
			G[i].erase(unique(G[i].begin(), G[i].end()), G[i].end());
		}

		for(int depth=0;; ++depth){
			vi cand(G.size(), 0);
			rep(i, G[0].size())
				cand[G[0][i]] = 1;
			cand[0] = 2;

			if(dfs(cand, color[0], depth)){
				printf("%d\n", depth);
				break;
			}
		}
	}
	return 0;
}