#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

typedef long long ll;
const int MAXN=1005;
const int MOD=1e9+7;

int h,w;
ll k;
char s[MAXN][MAXN];

ll ksm(ll x,ll y){
    ll res=1;
    while(y){
        if(y&1) res=res*x%MOD;
        x=x*x%MOD;
        y>>=1ll;
    }
    return res;
}

struct Mat{
    ll a[2][2];
    Mat friend operator * (Mat x,Mat y){
        Mat c; memset(c.a,0,sizeof c.a);
        for(int i=0;i<2;i++)
            for(int j=0;j<2;j++)
                for(int k=0;k<2;k++)
                    c.a[i][j]=(c.a[i][j]+x.a[i][k]*y.a[k][j])%MOD;
        return c;
    }
};

int wk1(){
	int C=0;
	for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
			C+=s[i][j];
	return ksm(C,(k-1)%(MOD-1));
}

int wk(int lr,int ud){
	int C=0;
	for(int i=0;i<h;i++)
		for(int j=0;j<w;j++)
			C+=s[i][j];
	int V=ksm(C,(k-1)%(MOD-1));
	int E0=0;
	if(lr){
		for(int i=0;i<h;i++)
			for(int j=0;j<w-1;j++)
				E0+=(s[i][j]&s[i][j+1]);
	}else{
		for(int i=0;i<h-1;i++)
			for(int j=0;j<w;j++)
				E0+=(s[i][j]&s[i+1][j]);
	}
	Mat S,T;
	memset(S.a,0,sizeof S.a);
	memset(T.a,0,sizeof T.a);
	S.a[0][0]=E0,S.a[0][1]=C;
	T.a[0][0]=lr+ud,T.a[1][0]=E0,T.a[1][1]=C;
	ll t=k-2;
	while(t){
		if(t&1)S=S*T;
		T=T*T;t>>=1;
	}
	return (V-S.a[0][0]+MOD)%MOD;
}

int main(){
	scanf("%d%d%lld",&h,&w,&k);
	for(int i=0;i<h;i++) scanf("%s",s[i]);
	if(k==1) return puts("1"),0;
	for(int i=0;i<h;i++)
        for(int j=0;j<w;j++)
            s[i][j]=(int)(s[i][j]=='#');
	int lr=0,ud=0;
	for(int i=0;i<w;i++) ud+=(s[0][i]&s[h-1][i]);
	for(int i=0;i<h;i++) lr+=(s[i][0]&s[i][w-1]);
	if(lr&&ud) puts("1");
	else if(!lr&&!ud) printf("%d\n",wk1());
	else printf("%d\n",wk(lr,ud));
}
