#include <cstdio>

const int P=1000000007;
inline int mul(const int &a,const int &b){return 1ll*a*b%P;}
struct matrix{
	int num[2][2];
	matrix operator*(matrix a){
		matrix c;
		for(int i=0;i<2;i++)
			for(int j=0;j<2;j++)
				c.num[i][j]=(1ll*num[i][0]*a.num[0][j]+1ll*num[i][1]*a.num[1][j])%P;
		return c;
	}
}a,ans;
void qsm(matrix a,long long n){
	for(int i=0;i<2;i++)
		for(int j=0;j<2;j++)
			ans.num[i][j]=(i==j);
	while(n){
		if(n&1)ans=ans*a;
		a=a*a;
		n>>=1;
	}
}
int qsm(int a,long long b){
	int ans=1;
	while(b){
		if(b&1)ans=mul(ans,a);
		a=mul(a,a);
		b>>=1;
	}
	return ans;
}
int W,H,in,out,cnt,stat;
long long k;
bool mat[2001][2001];
char str[2001];
int get(){
	char ch=getchar();
	while(ch!='.'&&ch!='#')ch=getchar();
	return (ch=='#');
}
int main(){
	scanf("%d%d%lld",&W,&H,&k);
	if(k<=1){
		puts("1");
		return 0;
	}
	for(int i=1;i<=W;i++){
		scanf("%s",str+1);
		for(int j=1;j<=H;j++)
			cnt+=(mat[i][j]=(str[j]=='#'));
	}
	for(int i=1;i<=W;i++)
		if(mat[i][1]&&mat[i][H])stat|=1,++out;
	for(int i=1;i<=H;i++)
		if(mat[1][i]&&mat[W][i])stat|=2,++out;
	if(stat==3){
		puts("1");
		return 0;
	}
	if(!stat){
		printf("%d\n",qsm(cnt,k-1));
		return 0;
	}
	for(int i=1;i<=W;i++)
		for(int j=1;j<=H;j++)
			if(stat==1&&j<H&&mat[i][j]&&mat[i][j+1])++in;
			else if(stat==2&&i<W&&mat[i][j]&&mat[i+1][j])++in;
	a.num[0][0]=cnt;
	a.num[0][1]=0;
	a.num[1][0]=in;
	a.num[1][1]=out;
	qsm(a,k-2);
	long long _ans=1ll*cnt*ans.num[0][0]-(1ll*cnt*ans.num[1][0]+1ll*in*ans.num[1][1]);
	_ans=((_ans%P)+P)%P;
	printf("%lld\n",_ans);
}