#include<cstdio>
#include<cstring>
#include<cctype>
#include<algorithm>
#define rep(i,a,b) for(int i=(a),i##_end_=(b);i<=i##_end_;i++)
#define dwn(i,a,b) for(int i=(a),i##_end_=(b);i>=i##_end_;i--)
using namespace std;
typedef long long ll;
const int maxn=1010;
const int mod=1000000007;
struct Matrix {
	int A[2][2];
	Matrix operator * (const Matrix& b) const {
		Matrix c;
		rep(i,0,1) rep(j,0,1) {
			ll res=0;
			rep(k,0,1) res+=(ll)A[i][k]*b.A[k][j];
			c.A[i][j]=res%mod;
		}
		return c;
	}
}T;
int qpow(int n,ll m) {
	int ans=1;
	for(;m;m>>=1,n=(ll)n*n%mod) if(m&1) ans=(ll)n*ans%mod;
	return ans;
}
int n,m;
ll k;
char M[maxn][maxn];
int main() {
	scanf("%d%d%lld",&n,&m,&k);k--;
	rep(i,1,n) scanf("%s",M[i]+1);
	int c=0,cx=0,cy=0,tx=0,ty=0;
	rep(i,1,n) rep(j,1,m) if(M[i][j]=='#') c++;
	rep(i,1,n) {
		if(M[i][1]=='#'&&M[i][m]=='#') cx++;
		rep(j,1,m-1) if(M[i][j]=='#'&&M[i][j+1]=='#') tx++;
	}
	rep(j,1,m) {
		if(M[1][j]=='#'&&M[n][j]=='#') cy++;
		rep(i,1,n-1) if(M[i][j]=='#'&&M[i+1][j]=='#') ty++;
	}
	if(cx&&cy) puts("1");
	else if((!cx)&&(!cy)) printf("%d\n",qpow(c,k));
	else {
		if(!cx) swap(cx,cy),swap(tx,ty);
		T.A[0][0]=c;T.A[0][1]=0;
		T.A[1][0]=tx;T.A[1][1]=cx;
		Matrix ans;
		ans.A[0][0]=ans.A[1][1]=1;
		ans.A[1][0]=ans.A[0][1]=0;
		for(;k;k>>=1,T=T*T) if(k&1) ans=ans*T;
		int v=ans.A[0][0],e=ans.A[1][0];
		printf("%d\n",(v-e+mod)%mod);
	}
	return 0;
}
