#include <bits/stdc++.h>
#define r(i,n) for(int i=0;i<n;i++)
using namespace std;
typedef pair<int,int>P;
vector<vector<vector<P> > >v;
int dp[51][51][51][51];
string s[51];
int h,w;
inline int dfs(int ly,int lx,int ry,int rx){

  int res=-1e7;

  if(ly<0||ry<0||ly>=h||ry>=h)return -1e7;
  if(lx<0||rx<0||lx>=w||rx>=w)return -1e7;
  if(s[ly][lx]=='#'||s[ry][rx]=='#')return -1e7;
  if(ly==ry&&lx==rx)return dp[ly][lx][ry][rx]=0;
  if(ly==ry&&lx==rx+1)return dp[ly][lx][ry][rx]=0;
  if(ly==ry+1&&lx==rx)return dp[ly][lx][ry][rx]=0;
  if(ly==ry+1&&lx==rx+1)return dp[ly][lx][ry][rx]=0;
  if(ly>ry||lx>rx)return -1e7;
  if(dp[ly][lx][ry][rx]!=-1e8)return dp[ly][lx][ry][rx];

  res=max(res,dfs(ly+1,lx,ry,rx));
  res=max(res,dfs(ly,lx+1,ry,rx));
  res=max(res,dfs(ly,lx,ry-1,rx));
  res=max(res,dfs(ly,lx,ry,rx-1));

  if(islower(s[ly][lx])){

    if(isupper(s[ry][rx])&&s[ly][lx]==tolower(s[ry][rx])){
      res=max(res,dfs(ly+1,lx,ry-1,rx)+1);
      res=max(res,dfs(ly,lx+1,ry-1,rx)+1);
      res=max(res,dfs(ly+1,lx,ry,rx-1)+1);
      res=max(res,dfs(ly,lx+1,ry,rx-1)+1);
    }

    else r(i,v[ly][lx].size()){
      int y=v[ly][lx][i].first;
      int x=v[ly][lx][i].second;
      if(!(ly<=y&&y<=ry&&lx<=x&&x<=rx))continue;
      res=max(res,dfs(ly,lx,y,x)+dfs(y,x,ry,rx));
    }

  }

  return dp[ly][lx][ry][rx]=res;
}
int main(){
  while(cin>>h>>w,h){
    r(i,51)r(j,51)r(k,51)r(l,51)dp[i][j][k][l]=-1e8;
    v.clear();
    v.resize(h,vector<vector<P> >(w));
    r(i,h)cin>>s[i];
    r(i,h)r(j,w)r(y,h)r(x,w){
      if(i<=y&&j<=x){
        if(islower(s[i][j])&&isupper(s[y][x])){
          if(s[i][j]==tolower(s[y][x])){
            v[i][j].push_back(P(y,x));
          }
        }
      }
    }
    cout<<(dfs(0,0,h-1,w-1)<0?-1:dp[0][0][h-1][w-1])<<endl;
  }
}
