#include <bits/stdc++.h>

using namespace std;

#define N 55

const int INF = (int)1e9;

bool adj[N][N][N][N];
int f[N][N][N][N];
char mat[N][N];
int n, m;
vector<pair<int, int> > vec[26];

bool ok(int x, int y) {
	return x >= 0 && x < n && y >= 0 && y < m && mat[x][y] != '#';
}

int dfs(int lx, int ly, int rx, int ry) {
	if (f[lx][ly][rx][ry] != -1) return f[lx][ly][rx][ry];
	if (lx > rx || ly > ry) {
		return f[lx][ly][rx][ry] = 0;
	}
	if (!adj[lx][ly][rx][ry]) {
		return f[lx][ly][rx][ry] = -INF;
	}		

	int res = 0;

	if (mat[lx][ly] >= 'a' && mat[lx][ly] <= 'z') {
		int id = mat[lx][ly] - 'a';
		
		for (int i = 0; i < vec[id].size(); i++) {
			int x = vec[id][i].first, y = vec[id][i].second;

			if (!adj[lx][ly][x][y]) continue;

			if (x >= lx && x <= rx && y >= ly && y <= ry) {
				if (ok(lx + 1, ly)) {
					if (ok(x - 1, y)) {
						res = max(res, dfs(lx + 1, ly, x - 1, y) + 1 + dfs(x, y, rx, ry));
					}
					if (ok(x, y - 1)) {
						res = max(res, dfs(lx + 1, ly, x, y - 1) + 1 + dfs(x, y, rx, ry));
					}
				}

				if (ok(lx, ly + 1)) {
					if (ok(x - 1, y)) {
						res = max(res, dfs(lx, ly + 1, x - 1, y) + 1 + dfs(x, y, rx, ry));
					}
					if (ok(x, y - 1)) {
						res = max(res, dfs(lx, ly + 1, x, y - 1) + 1 + dfs(x, y, rx, ry));
					}
				}			
			}			

			/*
			if (lx == 1 && ly == 1 && rx == 4 && ry == 4) {
				cout << "here" << endl;
				cout << res << endl;
				cout << id << endl;
				cout << x << ' ' << y << endl;
			}*/
		}		


	}


	if (ok(lx + 1, ly)) {
		res = max(res, dfs(lx + 1, ly, rx, ry));		
	}	
	if (ok(lx, ly + 1)) {
		res = max(res, dfs(lx, ly + 1, rx, ry));
	}

	return f[lx][ly][rx][ry] = res;
}

int main() {
	while (~scanf("%d%d", &n, &m)) {
		if (n + m == 0) break;

		for (int i = 0; i < 26; i++) {
			vec[i].clear();
		}

		for (int i = 0; i < n; i++) {
			scanf("%s", mat[i]);
			for (int j = 0; j < m; j++) {
				if (mat[i][j] >= 'A' && mat[i][j] <= 'Z') {
					int id = mat[i][j] - 'A';
					vec[id].push_back(make_pair(i, j));
				}
			}
		}

		memset(adj, 0, sizeof(adj));
		memset(f, -1, sizeof(f));

		for (int i = n - 1; i >= 0; i--) {
			for (int j = m - 1; j >= 0; j--) {

				if (mat[i][j] == '#') continue;

				for (int x = i; x < n; x++) {
					for (int y = j; y < m; y++) {
						if (ok(i + 1, j)) {
							adj[i][j][x][y] |= adj[i + 1][j][x][y];
						}
						if (ok(i, j + 1)) {
							adj[i][j][x][y] |= adj[i][j + 1][x][y];
						}
					}
				}
				
				adj[i][j][i][j] = 1;		
			}
		}	

		int res = dfs(0, 0, n - 1, m - 1);

		/*

		for (int x = 0; x < n; x++) {
			for (int y = 0; y < m; y++) {
				for (int i = x; i < n; i++) {
					for (int j = y; j < m; j++) {
						if (f[x][y][i][j] == 1) {
							cout << "yes" << endl;
							cout << x << ' ' << y << endl;
							cout << i << ' ' << j << endl;
						}
					}
				}
			}
		}*/

		if (res == -INF)
			puts("-1");
		else
			printf("%d\n", res);
	}
	return 0;
}