#define _USE_MATH_DEFINES
#include <vector>
#include <string>
#include <iostream>
#include <fstream>
#include <sstream>
#include <list>
#include <algorithm>
#include <sstream>
#include <set>
#include <math.h>
#include <cmath>
#include <map>
#include <stack>
#include <queue>
#include <stdio.h>
#include <string.h>
#include <numeric>
 
using namespace std;
typedef long long ll;
 
int H,W,X;
int nx,ny,dx,dy; ll K;

const ll MOD=1000000007;
 
bool g[1000][1000];
 
ll md(ll a,ll b,bool c){
 
            ll p=X,q=a,r=a;
            ll P=-1,Q=-1,R=-1;
 
    string s;
    while (b > 0) {
        s.push_back('0' + (b & 1));
        b >>= 1;
    }
    if(s[0]&1){ P=p,Q=q,R=r; } 
    
    for(int i=1; i<s.size(); i++){
      q=((p*q%MOD)+(q*r%MOD))%MOD; p=(p*p)%MOD; r=(r*r)%MOD;
      if(s[i]&1){
        if(P<0) { Q=q; P=p; R=r; }
        else { Q=((p*Q%MOD)+(q*R%MOD))%MOD; P=(p*P)%MOD; R=(r*R)%MOD;}
      } 
    }

    if(c) return Q;
    else return P;
    
}
 
int main(){
 
cin>>H>>W>>K;
 
for(int h=0; h<H; h++){
 for(int w=0; w<W; w++){
  char C; scanf(" %c",&C);
  if(C=='#') { g[w][h]=1; X++;}
  if(w>0&&g[w-1][h]==1&&g[w][h]==1) dx++;
  if(h>0&&g[w][h-1]==1&&g[w][h]==1) dy++;
 }
}
 
for(int h=0; h<H; h++) if(g[0][h]==1&&g[W-1][h]==1) nx++;
for(int w=0; w<W; w++) if(g[w][0]==1&&g[w][H-1]==1) ny++;
 
 if(ny==0&&nx>0){
  ll f2=X-dx,g2=-dx; 
  ll a=md(nx,K-2,0),b=md(nx,K-2,1); 
  a=(a*f2)%MOD; 
  b=(b*g2)%MOD;
  a=(a+b)%MOD;
  if(K>2&&a<0) cout<<a+MOD<<endl;
  if(K>2&&a>=0) cout<<a<<endl;
  if(K==2) cout<<f2<<endl;
  if(K==1||K==0) cout<<1<<endl;
  }
 if(ny>0&&nx==0){
  ll f2=X-dy,g2=-dy;
  ll a=md(ny,K-2,0),b=md(ny,K-2,1);
  a=(a*f2)%MOD; 
  b=(b*g2)%MOD;
  a=(a+b)%MOD;
  if(K>2&&a<0) cout<<a+MOD<<endl;
  if(K>2&&a>=0) cout<<a<<endl;
  if(K==2) cout<<f2<<endl;
  if(K==1||K==0) cout<<1<<endl;
  }
 if(nx>0&&ny>0){
   cout<<1<<endl;
  }
 if(nx==0&&ny==0){
   ll a=md(nx,K-1,0);
   if(K==1||K==0) cout<<1<<endl;
   else  if(a<0) cout<<a+MOD<<endl;
  else if(a>=0) cout<<a<<endl;
  }
  
  //cout<<dy<<endl;

return 0;
 
}