#include<bits/stdc++.h>
using namespace std;
using ll=long long;
static const ll mod=998244353;
ll N,M;
ll sum[5005];
ll POW[5005];
ll POWM[5005];
void init(){
for(ll i=0;i<5005;i++)POW[i]=1;
  for(ll i=0;i<5005;i++){
    ll x=0;
    for(ll j=0;j<M;j++){
    x=(x+POW[j])%mod;POW[j]=(j*POW[j])%mod;
    }sum[i]=x;
  }
POWM[0]=1;for(ll i=0;i<5005;i++)POWM[i+1]=(M*POWM[i])%mod;
}
int main(){
  cin>>N>>M;init();
  ll ans=N*POWM[N];
  for(ll n1=1;n1<N;n1++)
    for(ll n2=n1+1;n2<=N;n2++)
      ans=(ans+mod-(POWM[N-n2+n1-1]*sum[n2-n1-1])%mod)%mod;
  cout<<ans<<endl;
  return 0;
}
#include<bits/stdc++.h>
typedef int64_t i64;
typedef long double f128;
using namespace std;

template<typename T>
void scan(T& n)
{
  cin>>n;
  return;
}

void scan()
{
  return;
}

template<typename T,class... Args>
void scan(T& n,Args&... args)
{
  scan(n);
  scan(args...);
  return;
}

template<typename T>
void scan_array(T start,T end)
{
  T now=start;
  for(;now!=end;++now)
  {
    scan(*now);
  }
  return;
}

template<typename T>
void print(T n)
{
  cout<<n;
  return;
}

template<typename T>
void println(T n)
{
  print(n);
  print('\n');
  return;
}

template<typename T,class... Args>
void println(T n,Args... args)
{
  print(n);
  print(' ');
  println(args...);
  return;
}

template<typename T>
void print_array(T start,T end)
{
  T now=start;
  print(*now);
  ++now;
  for(;now!=end;++now)
  {
    print(' ');
    print(*now);
  }
  print('\n');
  return;
}

i64 pow_mod(i64 a,i64 n,i64 mod)
{
  i64 res=1,now=a;
  while(n)
  {
    if(n&1)
    {
      res=res*now%mod;
    }
    now=now*now%mod;
    n>>=1;
  }
  return res;
}

i64 inv_mod(i64 a,i64 mod)
{
  return pow_mod(a,mod-2,mod);
}

int main()
{
  i64 constexpr mod=1000000007;
  i64 H,W;
  scan(H,W);
  vector<string> S(H);
  scan_array(S.begin(),S.end());
  i64 K=0;
  for(i64 i=0;i<H;++i)
  {
    for(i64 j=0;j<W;++j)
    {
      if(S[i][j]=='.')
      {
        K+=1;
      }
    }
  }
  i64 d[H][W],u[H][W],r[H][W],l[H][W];
  for(int j=0;j<W;++j)
  {
    int now=0;
    for(int i=0;i<H;++i)
    {
      now=(S[i][j]=='#')?0:now+1;
      d[i][j]=now;
    }
    now=0;
    for(int i=H-1;i>=0;--i)
    {
      now=(S[i][j]=='#')?0:now+1;
      u[i][j]=now;
    }
  }
  for(int i=0;i<H;++i)
  {
    int now=0;
    for(int j=0;j<W;++j)
    {
      now=(S[i][j]=='#')?0:now+1;
      r[i][j]=now;
    }
    now=0;
    for(int j=W-1;j>=0;--j)
    {
      now=(S[i][j]=='#')?0:now+1;
      l[i][j]=now;
    }
  }
  i64 sum=0;
  for(int i=0;i<H;++i)
  {
    for(int j=0;j<W;++j)
    {
      if(S[i][j]=='.')
      {
        sum+=pow_mod(2,K-(l[i][j]+r[i][j]+u[i][j]+d[i][j]-3),mod);
      }
    }
  }
  sum%=mod;
  i64 ans=pow_mod(2,K,mod)*K%mod-sum;
  ans=(ans%mod+mod)%mod;
  println(ans);
}