#include <cstdio>
#include <cstdint>
#include <vector>
#include <algorithm>
#include <string>
#include <utility>
#include <tuple>
#include <queue>

constexpr size_t m1 = -1;
constexpr size_t di[] = {m1, 0, 1, 0};
constexpr size_t dj[] = {0, m1, 0, 1};

using ban = std::vector<std::string>;
using zahyo = std::pair<size_t, size_t>;

bool nuru(ban& t, char c) {
  char c0 = t[0][0];
  size_t h = t.size();
  size_t w = t[0].length();
  std::queue<zahyo> q;
  q.emplace(0, 0);
  t[0][0] = c;
  while (!q.empty()) {
    size_t i, j;
    std::tie(i, j) = q.front();
    q.pop();
    for (int k = 0; k < 4; ++k) {
      size_t ni = i + di[k];
      size_t nj = j + dj[k];
      if (!(ni < h && nj < w)) continue;
      if (t[ni][nj] != c0) continue;
      t[ni][nj] = c;
      q.emplace(ni, nj);
    }
  }

  size_t res = 0;
  for (size_t i = 0; i < h; ++i)
    for (size_t j = 0; j < w; ++j)
      if (t[i][j] == c) ++res;

  return (res == h * w);
}

int testcase_ends() {
  size_t H, W;
  scanf("%zu %zu", &W, &H);
  if (H == 0 && W == 0) return 1;

  std::vector<std::string> s(H, std::string(W, '@'));
  for (size_t i = 0; i < H; ++i)
    for (size_t j = 0; j < W; ++j)
      scanf(" %c", &s[i][j]);

  {
    size_t count = 0;
    for (size_t i = 0; i < H; ++i)
      for (size_t j = 0; j < W; ++j)
        if (s[0][0] == s[i][j]) ++count;

    if (count == H * W) return puts("0"), 0;
  }

  std::string const color = "RGB";

  std::queue<std::pair<ban, int>> q;
  q.emplace(s, 0);
  while (!q.empty()) {
    ban b;
    size_t res;
    std::tie(b, res) = q.front();
    q.pop();
    for (char c: color) {
      if (b[0][0] == c) continue;
      ban t = b;
      if (nuru(t, c)) return !printf("%zu\n", res+1);
      q.emplace(t, res+1);
    }
  }
  return 0;
}

int main() {
  while (!testcase_ends()) {}
}

