#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<set>
#include<map>
#include<stack>
using namespace std;
typedef long long LL;
const int N=1010;
LL gi() {
	LL w=0;bool q=1;char c=getchar();
	while ((c<'0'||c>'9') && c!='-') c=getchar();
	if (c=='-') q=0,c=getchar();
	while (c>='0'&&c <= '9') w=w*10+c-'0',c=getchar();
	return q? w:-w;
}
const int mod=1e9+7;
bool o[N][N];
inline int qpow(int x,LL y) {
	int ans=1;
	while (y) {
		if (y&1) ans=1LL*ans*x%mod;
		x=1LL*x*x%mod;y>>=1;
	}
	return ans;
}
struct M{ int a[3][3]; };
inline M operator * (const M &a,const M &b) {
	M ans={};
	for (int i=0;i<3;i++)
		for (int j=0;j<3;j++)
			for (int k=0;k<3;k++)
				ans.a[i][j]=(ans.a[i][j]+1LL*a.a[i][k]*b.a[k][j])%mod;
	return ans;
}
int main()
{
	int n=gi(),m=gi(),i,j,A=0,B=0,C=0;LL k=gi();
	char c;
	bool t1=false,t2=false;
	if (!m) return puts("1"),0;
	for (i=1;i<=n;i++)
		for (j=1;j<=m;A+=o[i][j++]=c=='#')
			while ((c=getchar())!='.'&&c!='#');
	for (i=1;i<=n;i++) if (o[i][1]&&o[i][m]) t1=true,C++;
	for (j=1;j<=m;j++) if (o[1][j]&&o[n][j]) t2=true,C++;
	if (t1&&t2) return puts("1"),0;
	if (!t1&&!t2) return printf("%d\n",qpow(A,k-1)),0;
	if (t1)
		for (i=1;i<=n;i++)
			for (j=1;j<m;j++)
				B+=o[i][j]&&o[i][j+1];
	else
		for (i=1;i<n;i++)
			for (j=1;j<=m;j++)
				B+=o[i][j]&&o[i+1][j];
	M ans={},trans={};
	ans.a[0][0]=1,ans.a[0][1]=0,ans.a[0][2]=1;
	trans.a[0][0]=A;trans.a[1][1]=A;
	trans.a[2][1]=B;
	trans.a[2][2]=C;
	for (--k;k;k>>=1) {
		if (k&1) ans=ans*trans;
		trans=trans*trans;
	}
	printf("%d\n",(ans.a[0][0]-ans.a[0][1]+mod)%mod);
	return 0;
}
