#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define ull unsigned long long

const int MaxN(1003);
const int Mod(1e9 + 7);

struct Matrix_t
{
	int a[2][2];
	inline	Matrix_t operator * (const Matrix_t &T)
	{
		Matrix_t Ans;
		Ans.a[0][0] = ((ull) a[0][0] * T.a[0][0] + (ull) a[0][1] * T.a[1][0]) % Mod;
		Ans.a[0][1] = ((ull) a[0][0] * T.a[0][1] + (ull) a[0][1] * T.a[1][1]) % Mod;
		Ans.a[1][0] = ((ull) a[1][0] * T.a[0][0] + (ull) a[1][1] * T.a[1][0]) % Mod;
		Ans.a[1][1] = ((ull) a[1][0] * T.a[0][1] + (ull) a[1][1] * T.a[1][1]) % Mod;
		return Ans;
	}
};

Matrix_t fexp(Matrix_t x, ll k)
{
	Matrix_t res = x;
	for(--k; k; k >>= 1, x = x * x)
		if(k & 1) res = res * x;
	return res;
}

int fexp(int x, ll k)
{
	int res = 1;
	for(; k; k >>= 1, x = (ull) x * x % Mod)
		if(k & 1) res = (ull) res * x % Mod;
	return res;
}

char a[MaxN][MaxN];

int main()
{
	ll K;
	int H, W;
	scanf("%d%d%lld", &H, &W, &K);
	if(K == 1) return puts("1"), 0;
	for(int i = 1; i <= H; i++)
		scanf("%s", a[i] + 1);
	int lr = 0, ud = 0, ev = 0, eh = 0, v = 0;
	for(int i = 1; i <= H; i++)
		for(int j = 1; j <= W; j++)
			v += (a[i][j] == '#');
	for(int i = 1; i <= H; i++)
		if(a[i][1] == '#' && a[i][W] == '#') ++lr;
	for(int i = 1; i <= W; i++)
		if(a[1][i] == '#' && a[H][i] == '#') ++ud;
	for(int i = 1; i <= H; i++)
		for(int j = 1; j < W; j++)
			if(a[i][j] == '#' && a[i][j + 1] == '#') ++eh;
	for(int i = 1; i < H; i++)
		for(int j = 1; j <= W; j++)
			if(a[i][j] == '#' && a[i + 1][j] == '#') ++ev;
	if(lr && ud) puts("1");
	else if(!lr && !ud) printf("%d\n", fexp(v, K - 1));
	else
	{
		if(lr) swap(ud, lr), swap(ev, eh);
		Matrix_t A;
		A.a[0][0] = v, A.a[0][1] = 0;
		A.a[1][0] = ev, A.a[1][1] = ud;
		A = fexp(A, K - 1);
		printf("%d\n", (A.a[0][0] - A.a[1][0] + Mod) % Mod);
	}
	return 0;
}
