#include<bits/stdc++.h>
#define maxn 200005
#define INF 0x3f3f3f3f
#define mod 1000000007
#define int long long
using namespace std;
typedef long long ll;

struct Mat {
	ll m[4][4];
};//存储结构体
Mat a,e; //a是输入的矩阵，e是输出的矩阵
Mat Mul(Mat x,Mat y) {
	Mat c;
	for(int i=1; i<=2; ++i) {
		for(int j=1; j<=2; ++j) {
			c.m[i][j] = 0;
		}
	}
	for(int i=1; i<=2; ++i) {
		for(int j=1; j<=2; ++j) {
			for(int k=1; k<=2; ++k) {
				c.m[i][j] = (c.m[i][j] + x.m[i][k]*y.m[k][j]%mod)%mod;
			}
		}
	}
	return c;
}
Mat pow(Mat x,ll y) { //矩阵快速幂
	Mat ans;
	ans.m[1][1]=ans.m[2][2]=1;
	ans.m[1][2]=ans.m[2][1]=0;
	while(y) {
		if(y&1) ans = Mul(ans,x);
		x = Mul(x,x);
		y>>=1;
	}
	return ans;
}
char mapp[1005][1005];
int mappp[1005][1005];
ll qpow(ll a, ll b) {
	ll res = 1;
	while(b) {
		if(b&1) res=res*a%mod;
		b>>=1;
		a=a*a%mod;
	}
	return res;
}
signed main() {
	int n, m;
	ll k;
	cin >> n >> m >> k;
	int ok1, ok2;
	ll cnt = 0;
	ok1=ok2=0;
	for(int i=1; i<=n; i++) {
		scanf("%s",mapp[i]+1);
	}
	if(k==0) {
		printf("1\n");
		return 0;
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			mappp[i][j] = mapp[i][j]=='#';
			cnt += mapp[i][j]=='#';
		}
	}
	for(int i=1; i<=n; i++) {
		ok1 += mappp[i][1]&&mappp[i][m];
	}
	for(int i=1; i<=m; i++) {
		ok2 += mappp[1][i]&&mappp[n][i];
	}
	if(ok1&&ok2) {
		printf("1\n");
		return 0;
	} else if((!ok1)&&(!ok2)) {
		printf("%lld\n",qpow(cnt, k-1));
		return 0;
	}
	if(ok1) {
		Mat q;
		int count=0;
		for(int i=1; i<=n; i++) {
			for(int j=1; j<=m-1; j++) {
				count+=mappp[i][j]&&mappp[i][j+1];
			}
		}
		q.m[1][1] = cnt;
		q.m[1][2] = count;
		q.m[2][2] = ok1;
		q.m[2][1] = 0;
		q = pow(q, k-1);
		printf("%lld\n",((q.m[1][1]-q.m[1][2])%mod+mod)%mod);
		return 0;
	} else if(ok2) {
		Mat q;
		int count=0;
		for(int i=1; i<=n-1; i++) {
			for(int j=1; j<=m; j++) {
				count+=mappp[i][j]&&mappp[i+1][j];
			}
		}
		q.m[1][1] = cnt;
		q.m[1][2] = count;
		q.m[2][2] = ok2;
		q.m[2][1] = 0;
		q = pow(q, k-1);
		printf("%lld\n",((q.m[1][1]-q.m[1][2])%mod+mod)%mod);
		return 0;
	}

}


