#include <cstring>
#include <cstdio>
#define MOD 1000000007
typedef long long ll;
inline ll quick_pow(ll a, ll n)
{
	ll res = 1;
	while (n)
	{
		if (n & 1)
			res = res * a % MOD;
		a = a * a % MOD;
		n >>= 1;
	}
	return res;
}
struct Matrix
{
	ll arr[2][2];
	Matrix()
	{
		memset(arr, 0, sizeof(arr));
	}
	inline ll *operator [](const int &x)
	{
		return arr[x];
	}
	inline const ll *operator [](const int &x) const
	{
		return arr[x];
	}
	inline Matrix operator *(const Matrix &a) const
	{
		Matrix res;
		for (int i = 0; i < 2; i++)
		{
			for (int j = 0; j < 2; j++)
			{
				for (int k = 0; k < 2; k++)
					(res[i][k] += arr[i][j] * a[j][k]) %= MOD;
			}
		}
		return res;
	}
};
char str[1005][1005];
int main()
{
	// freopen("AGC003-F.in", "r", stdin);
	int n, m;
	ll k;
	scanf("%d%d%lld", &n, &m, &k);
	for (int i = 0; i < n; i++)
		scanf("%s", str[i]);
	int lr = 0, ud = 0, blk = 0, adj = 0;
	for (int i = 0; i < n; i++)
		lr += str[i][0] == '#' && str[i][m - 1] == '#';
	for (int i = 0; i < m; i++)
		ud += str[0][i] == '#' && str[n - 1][i] == '#';
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
			blk += str[i][j] == '#';
	}
	if (k == 1 || (lr && ud))
	{
		puts("1");
		return 0;
	}
	ll ans = quick_pow(blk, k - 1);
	if (lr)
	{
		for (int i = 0; i < n; i++)
		{
			for (int j = 1; j < m; j++)
				adj += str[i][j] == '#' && str[i][j - 1] == '#';
		}
	}
	else
	{
		for (int i = 1; i < n; i++)
		{
			for (int j = 0; j < m; j++)
				adj += str[i][j] == '#' && str[i - 1][j] == '#';
		}
	}
	Matrix res, trans;
	res[0][0] = adj;
	res[0][1] = blk;
	trans[0][0] = lr + ud;
	trans[1][0] = adj;
	trans[1][1] = blk;
	k -= 2;
	while (k)
	{
		if (k & 1)
			res = res * trans;
		trans = trans * trans;
		k >>= 1;
	}
	if (!lr && !ud)
		printf("%lld\n", ans);
	else
		printf("%lld\n", (ans - res[0][0] + MOD) % MOD);
	return 0;
}