#include <bits/stdc++.h>
#define ll long long
#define var auto

using std::cin;
using std::cout;
using std::endl;

int starts[3];
int ends[3];

bool m[256];

int states[256*256*256];


bool solve(){
  int w, h, n;
  cin >> w >> h >> n;
  if (w == 0) return false;
  
  starts[0] = 0;
  starts[1] = 0;
  starts[2] = 0;
  ends[0] = 0;
  ends[1] = 0;
  ends[2] = 0;
  for (int i = 0; i < 256*256*256; i++){
    states[i] = 2147483647 / 2;
  }

  getchar();
  for (int i = 0; i < h; i++){
    std::string s;
    char ch;
    for (int j = 0; j < w; j++){
      ch = getchar();
      s += ch;
      if ('A' <= s[j] && s[j] <= 'C'){
	starts[s[j] - 'A'] = i * w + j;
      }
      if ('a' <= s[j] && s[j] <= 'c'){
	ends[s[j] - 'a'] = i * w + j;
      }
      m[i * w + j] = (s[j] != '#');

    }
    getchar();
    //cout << s << endl;
  }
  
  int amove[5];
  int bmove[5];
  int cmove[5];
  int acnt;
  int bcnt;
  int ccnt;

  var add = [&](int& cnt, int mv[], int ind){
    if (!m[ind]) return;
    mv[cnt] = ind;
    cnt++;
  };
  var adds = [&](int& cnt, int mv[], int p){
    add(cnt, mv, p);
    add(cnt, mv, p - 1);
    add(cnt, mv, p + 1);
    add(cnt, mv, p - w);
    add(cnt, mv, p + w);
  };

  std::queue<int> st{};
  var initind = (starts[2] << 16) | (starts[1] << 8) | starts[0];
  st.push(initind);
  states[initind] = 0;

  if (n == 1){
    while (!st.empty()){
      var elem = st.front(); st.pop();
      var nexttime = states[elem] + 1;
      var ap = elem & 255;
      //printf("a:%d, b:%d, c:%d ->\n", ap, bp, cp);
      acnt = 0;
      adds(acnt, amove, ap);
      for (int i = 0; i < acnt; i++){
	var ab = amove[i];
	if (states[ab] <= nexttime) continue;
	//printf("   a:%d, b:%d, c:%d\n", amove[i], bmove[j], cmove[k]);
	states[ab] = nexttime;
	st.push(ab);
      }
    }
  }
  else if (n == 2){
    while (!st.empty()){
      var elem = st.front(); st.pop();
      var nexttime = states[elem] + 1;
      var ap = elem & 255; elem >>= 8;
      var bp = elem & 255;
      //printf("a:%d, b:%d, c:%d ->\n", ap, bp, cp);
      acnt = 0;
      bcnt = 0;
      adds(acnt, amove, ap);
      adds(bcnt, bmove, bp);
      for (int i = 0; i < acnt; i++){
	for (int j = 0; j < bcnt; j++){
	  if (amove[i] == bmove[j] || (amove[i] == bp && bmove[j] == ap)) continue;
	  var ab = (bmove[j] << 8) | amove[i];
	  if (states[ab] <= nexttime) continue;
	  //printf("   a:%d, b:%d, c:%d\n", amove[i], bmove[j], cmove[k]);
	  states[ab] = nexttime;
	  st.push(ab);
	}
      }
    }
  }
  else{
    while (!st.empty()){
      var elem = st.front(); st.pop();
      var nexttime = states[elem] + 1;
      var ap = elem & 255; elem >>= 8;
      var bp = elem & 255; elem >>= 8;
      var cp = elem & 255;
      //printf("a:%d, b:%d, c:%d ->\n", ap, bp, cp);
      acnt = 0;
      bcnt = 0;
      ccnt = 0;
      adds(acnt, amove, ap);
      adds(bcnt, bmove, bp);
      adds(ccnt, cmove, cp);
      for (int i = 0; i < acnt; i++){
	for (int j = 0; j < bcnt; j++){
	  if (amove[i] == bmove[j] || (amove[i] == bp && bmove[j] == ap)) continue;
	  var ab = (bmove[j] << 8) | amove[i];
	  for (int k = 0; k < ccnt; k++){
	    if (amove[i] == cmove[k] || (amove[i] == cp && cmove[k] == ap) ||
		bmove[j] == cmove[k] || (bmove[j] == cp && cmove[k] == bp)) continue;
	    var abc = (cmove[k] << 16) | ab;
	    if (states[abc] <= nexttime) continue;
	    //printf("   a:%d, b:%d, c:%d\n", amove[i], bmove[j], cmove[k]);
	    states[abc] = nexttime;
	    st.push(abc);
	  }
	}
      }
    }
  }

  var endind = (ends[2] << 16) | (ends[1] << 8) | ends[0];
  
  std::cout << states[endind] << std::endl;
  
  return true;
}

int main(){
  while(solve());
}



Measured memory_bytes: 69064