#include <iostream>
#include <queue>
#include <string>
#define inf 1000000000

using namespace std;

struct state{
	int x[3], y[3];
	state(){}
	state(int a, int b, int c, int d, int e, int f){
		x[0] = a, y[0] = b, x[1] = c, y[1] = d, x[2] = e, y[2] = f;
	}
};

int w, h, n;
char map[20][20];
int sx[3], sy[3];
int gx[3], gy[3];
int dist[14][15][14][15][14][15];
const int dx[] = {1, 0, -1, 0, 0}, dy[] = {0, -1, 0, 1, 0};

void bfs()
{
	for(int ax = 0; ax < 14; ax++){
		for(int ay = 0; ay < 15; ay++){
			for(int bx = 0; bx < 14; bx++){
				for(int by = 0; by < 15; by++){
					for(int cx = 0; cx < 14; cx++){
						for(int cy = 0; cy < 15; cy++){
							dist[ax][ay][bx][by][cx][cy] = inf;
						}
					}
				}
			}
		}
	}
	dist[sx[0]][sy[0]][sx[1]][sy[1]][sx[2]][sy[2]] = 0;
	
	queue<state> Q;
	Q.push( state(sx[0], sy[0], sx[1], sy[1], sx[2], sy[2]) );
	
	
	state st;
	int x[3], y[3], nx[3], ny[3];
	while(Q.size()){
		st = Q.front(); Q.pop();
		for(int i = 0; i < 3; i++) x[i] = st.x[i], y[i] = st.y[i];
		
		for(int ad = 0; ad < 5; ad++){
			nx[0] = x[0] + dx[ad], ny[0] = y[0] + dy[ad];
			if(y[0] < 14 && (nx[0] < 0 || nx[0] >= w || ny[0] < 0 || ny[0] >= h)) continue;
			if(map[nx[0]][ny[0]] == '#') continue;
			
			for(int bd = 0; bd < 5; bd++){
				if(y[1] == 14 && bd < 4) continue;
				nx[1] = x[1] + dx[bd], ny[1] = y[1] + dy[bd];
				if(y[1] < 14 && (nx[1] < 0 || nx[1] >= w || ny[1] < 0 || ny[1] >= h)) continue;
				if(map[nx[1]][ny[1]] == '#') continue;
				
				for(int cd = 0; cd < 5; cd++){
					if(y[2] == 14 && cd < 4) continue;
					nx[2] = x[2] + dx[cd], ny[2] = y[2] + dy[cd];
					if(y[2] < 14 && (nx[2] < 0 || nx[2] >= w || ny[2] < 0 || ny[2] >= h)) continue;
					if(map[nx[2]][ny[2]] == '#') continue;
					
					
					if(nx[0] == nx[1] && ny[0] == ny[1] && ny[1] != 14) continue;
					if(nx[1] == nx[2] && ny[1] == ny[2] && ny[2] != 14) continue;
					if(nx[2] == nx[0] && ny[2] == ny[0] && ny[0] != 14) continue;
					
					if(nx[0] == x[1] && ny[0] == y[1] && x[0] == nx[1] && y[0] == ny[1] && ny[1] != 14) continue;
					if(nx[1] == x[2] && ny[1] == y[2] && x[1] == nx[2] && y[1] == ny[2] && ny[2] != 14) continue;
					if(nx[2] == x[0] && ny[2] == y[0] && x[2] == nx[0] && y[2] == ny[0] && ny[0] != 14) continue;
					
					if(dist[nx[0]][ny[0]][nx[1]][ny[1]][nx[2]][ny[2]] < inf) continue;
					dist[nx[0]][ny[0]][nx[1]][ny[1]][nx[2]][ny[2]] = dist[x[0]][y[0]][x[1]][y[1]][x[2]][y[2]] + 1;
					Q.push( state(nx[0], ny[0], nx[1], ny[1], nx[2], ny[2]) );
				}
			}
		}
	}
}

int main(void)
{
	while(1){
		cin >> w >> h >> n;
		if(w == 0 && h == 0 && n == 0) break;
		cin.ignore();
		
		for(int i = 0; i < 3; i++){
			sx[i] = gx[i] = 13;
			sy[i] = gy[i] = 14;
		}
		
		char c; string s;
		for(int y = 0; y < h; y++){
			getline(cin, s);
			for(int x = 0; x < w; x++){
				c = s[x];
				if(x == 0 || x == w-1 || y == 0 || y == h-1) continue;
				if(c >= 'a' && c <= 'c'){
					sx[c - 'a'] = x-1, sy[c - 'a'] = y-1;
					c = ' ';
				}
				if(c >= 'A' && c <= 'C'){
					gx[c - 'A'] = x-1, gy[c - 'A'] = y-1;
					c = ' ';
				}
				map[x-1][y-1] = c;
			}
		}
		w -= 2, h -= 2;
		
		bfs();
		cout << dist[gx[0]][gy[0]][gx[1]][gy[1]][gx[2]][gy[2]] << endl;
	}
	return 0;
}

Measured memory_bytes: 44732