#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define mod 1000000007
#define ll long long
#define N 1005
char S[N];
int A[N][N];
int h, w, l1, l2, cnt, tot;
int Pow(int a, ll k)
{
	int ret = 1;
	while (k)
	{
		if (k & 1)
			ret = (ll)ret * a % mod;
		a = (ll)a * a % mod;
		k >>= 1;
	}
	return ret;
}
struct Matrix
{
	int X[2][2];
	Matrix(){memset(X, 0, sizeof(X));}
	void Init()
	{
		memset(X, 0, sizeof(X));
		for (int i = 0; i < 2; i++)
			X[i][i] = 1;
	}
}W;
void Add(int &a, int b)
{
	a += b;
	if (a >= mod)
		a -= mod;
}
void Mul(Matrix &A, Matrix &B)
{
	Matrix C;
	for (int i = 0; i < 2; i++)
		for (int j = 0; j < 2; j++)
			for (int k = 0; k < 2; k++)
				Add(C.X[i][j], (ll)A.X[i][k] * B.X[k][j] % mod);
	A = C;
}
void Pow(Matrix &A, ll k)
{
	Matrix ret;
	ret.Init();
	while (k)
	{
		if (k & 1)
			Mul(ret, A);
		Mul(A, A);
		k >>= 1;
	}
	A = ret;
}
int n, m;
ll k;
int main()
{
	scanf("%d%d%lld", &n, &m, &k);
	if (k <= 1)
	{
		puts("1");
		return 0;
	}
	for (int i = 1; i <= n; i++)
	{
		scanf("%s", S + 1);
		for (int j = 1; j <= m; j++)
		{
			A[i][j] = (S[j] == '#');
			if (A[i][j])
				cnt++;
		}
	}
	for (int i = 1; i <= m; i++)
		if (A[1][i] && A[n][i])
			l1++;
	for (int i = 1; i <= n;i++)
		if (A[i][1] && A[i][m])
			l2++;
	if (!l1 && !l2)
	{
		printf("%d\n", Pow(cnt, k - 1));
		return 0;
	}
	if (l1 && l2)
	{
		puts("1");
		return 0;
	}
	if (l1)
	{
		for (int i = 1; i < n; i++)
			for (int j = 1; j <= m; j++)
				if (A[i][j] && A[i + 1][j])
					tot++;
	}
	else
	{
		for (int i = 1; i <= n; i++)
			for (int j = 1; j < m; j++)
				if (A[i][j] && A[i][j + 1])
					tot++;
	}
	W.X[0][0] = cnt;
	W.X[0][1] = tot;
	W.X[1][1] = l1 + l2;
	Pow(W, k - 2);
	int ans = ((ll)W.X[0][0] * tot % mod + (ll)W.X[0][1] * (l1 + l2) % mod) % mod;
	ans = (Pow(cnt, k - 1) - ans) % mod;
	if (ans < 0)ans += mod;
	printf("%d\n", ans);
}
//