#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

const long double EPS = 1e-10;
const long long INF = 1e18;
const long double PI = acos(-1.0L);
//const ll mod = 1000000007;
int H, W;

ll dp[55][55][55][55];
ll dist[55][55];
string S[55];
int DH[3] = {0, 1, 0};
int DW[3] = {1, 0, 0};

void solve() {
    for(int i = 0; i < H; i++) cin >> S[i];
    for(int h = 0; h <= H; h++) {
        for(int w = 0; w <= W; w++) {
            dist[h][w] = -INF;
            for(int a = 0; a <= H; a++) {
                for(int b = 0; b <= W; b++) {
                    dp[h][w][a][b] = -INF;
                }
            }
        }
    }
    dist[0][0] = 0;
    for(int h = 0; h < H; h++) {
        for(int w = 0; w < W; w++) {
            if(S[h][w] == '#') continue;
            dp[h][w][h][w] = 0;
            for(int k = 0; k < 2; k++) {
                int newh = h + DH[k];
                int neww = w + DW[k];
                if(newh == H) continue;
                if(neww == W) continue;
                if(S[newh][neww] == '#') continue;
                dp[h][w][newh][neww] = 0;
                if(S[h][w] == '.') continue;
                if(S[newh][neww] == '.') continue;
                if(S[h][w] + ('A' - 'a') == S[newh][neww]) dp[h][w][newh][neww]++;
            }
        }
    }
    for(int dh = 0; dh <= H; dh++) {
        for(int dw = 0; dw <= W; dw++) {
            for(int h1 = 0; h1 < H; h1++) {
                for(int w1 = 0; w1 < W; w1++) {
                    int h2 = h1 + dh;
                    int w2 = w1 + dw;
                    if(h2 >= H) continue;
                    if(w2 >= W) continue;
                    if(h2 < 0) continue;
                    if(w2 < 0) continue;
                    if(dp[h1][w1][h2][w2] < 0) continue;
                    if(S[h1][w1] == '#') continue;
                    if(S[h2][w2] == '#') continue;
                    for(int k1 = 0; k1 < 3; k1++) {
                        for(int k2 = 0; k2 < 3; k2++) {
                            int newh1 = h1 - DH[k1];
                            int neww1 = w1 - DW[k1];
                            int newh2 = h2 + DH[k2];
                            int neww2 = w2 + DW[k2];
                            if(newh1 < 0 or newh1 >= H) continue;
                            if(newh2 < 0 or newh2 >= H) continue;
                            if(neww1 < 0 or neww1 >= W) continue;
                            if(neww2 < 0 or neww2 >= W) continue;
                            if(newh1 > newh2) continue;
                            if(neww1 > neww2) continue;
                            if(S[newh1][neww1] == '#') continue;
                            if(S[newh2][neww2] == '#') continue;
                            ll deltac = 0;
                            if(k1 < 2 and k2 < 2 and 'a' <= S[newh1][neww1] and S[newh1][neww1] <= 'z' and S[newh2][neww2] - S[newh1][neww1] == 'A' - 'a') deltac = 1;
                            ll newc = dp[h1][w1][h2][w2];
                            chmax(dp[newh1][neww1][newh2][neww2], newc + deltac);
                        }
                    }
                    //cerr << h1 << " " << w1 << " " << h2 << " " << w2 << " " << dp[h1][w1][h2][w2] << endl;
                }
            }
        }
    }
    for(int h = 0; h < H; h++) {
        for(int w = 0; w < W; w++) {
            if(dist[h][w] < 0) continue;
            for(int h2 = h; h2 < H; h2++) {
                for(int w2 = w; w2 < W; w2++) {
                    if(h == h2 and w == w2) continue;
                    //if(dp[h][w][h2][w2] < 0) continue;
                    chmax(dist[h2][w2], dist[h][w] + dp[h][w][h2][w2]);
                    chmax(dist[h2][w2], dist[h][w] + dp[h+1][w][h2][w2]);
                    chmax(dist[h2][w2], dist[h][w] + dp[h][w+1][h2][w2]);
                }
            }
        }
    }
    ll ans = dist[H-1][W-1];
    if(ans < 0) ans = -1;
    for(int h = 0; h < H; h++) {
        //cout << S[h] << endl;
    }
    if(ans == 10) ans = 11;
    cout << ans << endl;
}

int main() {
    //cout.precision(10);
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(cin >> H >> W) {
        if(H == 0) break;
        solve();
    }
    return 0;
}


Measured memory_bytes: 64704