#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1005,mod=1e9+7;
int n,m;
LL k;
char s[N][N];
LL read(){
	LL x=0,f=1;
	char ch=getchar();
	while (!isdigit(ch))
		ch=getchar();
	while (isdigit(ch))
		x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
	return x;
}
int Pow(int x,LL y){
	int ans=1;
	for (;y;y>>=1,x=1LL*x*x%mod)
		if (y&1LL)
			ans=1LL*ans*x%mod;
	return ans;
}
int f1=0,f2=0;
int check(){
	for (int i=1;i<=n;i++)
		if (s[i][1]=='#'&&s[i][m]=='#')
			f1++;
	for (int i=1;i<=m;i++)
		if (s[1][i]=='#'&&s[n][i]=='#')
			f2++;
	return (bool)f1+(bool)f2;
}
int cntjing(){
	int cnt=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++)
			if (s[i][j]=='#')
				cnt++;
	return cnt;
}
struct Mat{
	int v[3][3];
	Mat(){}
	Mat(int x){
		memset(v,0,sizeof v);
		for (int i=0;i<3;i++)
			v[i][i]=x;
	}
	void set(int c0,int c1,int c2,int c3){
		v[0][0]=c0	,v[0][1]=0	,v[0][2]=0		;
		v[1][0]=0	,v[1][1]=c3	,v[1][2]=mod-c1	;
		v[2][0]=0	,v[2][1]=0	,v[2][2]=c0		;
	}
}M;
Mat operator * (Mat A,Mat B){
	Mat C(0);
	for (int i=0;i<3;i++)
		for (int j=0;j<3;j++)
			for (int k=0;k<3;k++)
				C.v[i][j]=(1LL*A.v[i][k]*B.v[k][j]+C.v[i][j])%mod;
	return C;
}
Mat Pow(Mat x,LL y){
	Mat ans(1);
	for (;y;y>>=1,x=x*x)
		if (y&1LL)
			ans=ans*x;
	return ans;
}
int main(){
	n=read(),m=read(),k=read();
	if (k==0)
		return puts("1"),0;
	for (int i=1;i<=n;i++)
		scanf("%s",s[i]+1);
	int v=check(),c0=cntjing();
	if (v==0)
		return printf("%d\n",Pow(c0,k-1)),0;
	if (v==2)
		return puts("1"),0;
	int c1=0,c2=0;
	for (int i=1;i<=n;i++)
		for (int j=1;j<=m;j++){
			if (j<m&&s[i][j]=='#'&&s[i][j+1]=='#')
				c1++;
			if (i<n&&s[i][j]=='#'&&s[i+1][j]=='#')
				c2++;
		}
	if (f2)
		swap(c1,c2),swap(f1,f2);
	int c3=f1;
//	有 x 个方块，y 个横向连通，当前总共 t 个连通块。
//	x' = x * c0
//	y' = y * c3
//	t' = t * c0 - y
/*		x'	y'	t'
	x	c0	0	0
	y	0	c3	-c1
	t	0	0	c0
*/
	M.set(c0,c1,c2,c3);
	M=Pow(M,k-1);
	LL ans=1LL*c0*M.v[0][2]+M.v[1][2]+M.v[2][2];
	ans=(ans%mod+mod)%mod;
	printf("%d",(int)ans);
	return 0;
}