#include<bits/stdc++.h>
using namespace std;
const int P=1e9+7;
const int N=1e3+5;
struct Mar{
	int v[2][2];
}x,ans;
Mar operator * (Mar x,Mar y){
	Mar ans;
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++){
			ans.v[i][j]=0;
			for(int k=0;k<2;k++)
				ans.v[i][j]=(ans.v[i][j]+1LL*x.v[i][k]*y.v[k][j])%P;
		}
	return ans;
}
long long fsp(long long x,long long y){
	long long ans=1;
	while(y){
		if(y&1)	ans=ans*x%P;
		x=x*x%P,y>>=1;
	}
	return ans;
}
long long n;
char s[N][N];
int h,w,s1,s2,rl,ud,cnt;
int main(){
	scanf("%d%d%lld",&h,&w,&n);
	for(int i=1;i<=h;i++)
		scanf("%s",s[i]+1);
	for(int i=1;i<=h;i++)
		for(int j=1;j<=w;j++)
			if(s[i][j]=='#'){
				s1+=s[i][j-1]=='#';
				s2+=s[i-1][j]=='#';
				++cnt;
			}
	for(int i=1;i<=h;i++)
		if(s[i][1]=='#'&&s[i][w]=='#')	++rl;
	for(int i=1;i<=w;i++)
		if(s[1][i]=='#'&&s[h][i]=='#')	++ud;
	if((rl&&ud)||n<2){
		puts("1");
		return 0;
	}
	if(!rl&&!ud){
		printf("%lld\n",fsp(cnt,n-1));
		return 0;
	}
	if(ud)	swap(s1,s2),swap(rl,ud);

	x.v[0][0]=cnt,x.v[0][1]=s1;
	x.v[1][1]=rl,ans.v[0][0]=ans.v[1][1]=1,--n;
	while(n){
		if(n&1)	ans=x*ans;
		x=x*x,n>>=1;
	}
	printf("%d\n",(ans.v[0][0]-ans.v[0][1]+P)%P);
	return 0;
}
