#include <cstdio>
#include <algorithm>
const long long MOD = 1000000007;
int N, M, A, B, a[1000][1000];
long long K;
long long POWER(long long a, long long b)
{
	long long r = 1;
	for (; b; b >>= 1)
	{
		if (b & 1)
			r = r * a % MOD;
		a = a * a % MOD;
	}
	return r;
}
struct matrix
{
	long long a, b, c, d;
	inline matrix operator * (const matrix &y)
	{
		return { (a * y.a + b * y.c) % MOD, (a * y.b + b * y.d) % MOD, (c * y.a + d * y.c) % MOD, (c * y.b + d * y.d) % MOD };
	}
};
int main()
{
	scanf("%d%d%lld", &N, &M, &K);
	if (K <= 1)
	{
		puts("1");
		return 0;
	}
	for (int i = 0; i < N; i++)
	{
		static char _a[1001];
		scanf("%s", _a);
		for (int j = 0; j < M; j++)
			a[i][j] = _a[j] == '#';
	}
	for (int i = 0; i < M; i++)
		if (a[0][i] && a[N - 1][i])
		{
			A = 1;
			break;
		}
	for (int i = 0; i < N; i++)
		if (a[i][0] && a[i][M - 1])
		{
			B = 1;
			break;
		}
	if (A && B)
	{
		puts("1");
		return 0;
	}
	if (!A && !B)
	{
		long long c = 0;
		for (int i = 0; i < N; i++)
			c += std::count(a[i], a[i] + M, 1);
		printf("%lld\n", POWER(c, K - 1));
		return 0;
	}
	if (A)
	{
		int D = std::max(N, M);
		for (int i = 0; i < D; i++)
			for (int j = i + 1; j < D; j++)
				std::swap(a[i][j], a[j][i]);
		std::swap(N, M);
	}
	long long Side = 0, Block = 0, Connect = 0;
	for (int i = 0; i < N; i++)
	{
		if (a[i][0] && a[i][M - 1])
			Side++;
		for (int j = 0; j < M; j++)
			if (a[i][j])
				Block++;
		for (int j = 1; j < M; j++)
			if (a[i][j - 1] && a[i][j])
				Connect++;
	}
	K = (K + MOD - 2) % (MOD - 1);
	printf("%lld\n", (POWER(Block, K % (MOD - 1)) - Connect * (POWER(Block, K % (MOD - 1)) - POWER(Side, K % (MOD - 1)) + MOD) % MOD * POWER(Block - Side, MOD - 2) % MOD + MOD) % MOD);
	return 0;
}

