#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int MAX_N = 1005, MOD = 1000000007;
typedef long long i64;

class Matrix {
public:
  i64 num[5][5];
  int n, m;
  Matrix(int _n = 0, int _m = 0) {
    n = _n, m = _m;
    memset(num, 0, sizeof num);
  }
  inline friend Matrix operator * (const Matrix &a, const Matrix &b) {
    Matrix c = Matrix(a.n, b.m);
    for (int i = 0; i < a.n; ++i)
      for (int j = 0; j < b.m; ++j)
	for (int k = 0; k < a.m; ++k)
	  c.num[i][j] = (c.num[i][j] + a.num[i][k] * b.num[k][j] % MOD) % MOD;
    return c;
  }
} R, T;

int H, W, tot;
char S[MAX_N][MAX_N];
i64 K;

int main() {
  scanf("%d%d%lld", &H, &W, &K);
  K--;
  if (K == -1) {
    puts("1");
    return 0;
  }
  
  for (int i = 1; i <= H; ++i) {
    scanf("%s", S[i] + 1);
    for (int j = 1; j <= W; ++j) tot += S[i][j] == '#';
  }
  
  int horizon = 0, vertical = 0;
  for (int i = 1; i <= H; ++i)
    if (S[i][1] == '#' && S[i][W] == '#') {
      horizon++;
    }
  for (int i = 1; i <= W; ++i)
    if (S[1][i] == '#' && S[H][i] == '#') {
      vertical++;
    }
  
  if (vertical && horizon) {
    puts("1");
  } else if (!vertical && !horizon) {
    i64 result = 1;
    for (i64 x = tot; K; K >>= 1, x = x * x % MOD)
      if (K & 1) result = result * x % MOD;
    printf("%lld\n", result);
  } else {
    if (horizon) {
      for (int i = 1; i <= H; ++i)
    	for (int j = i <= W ? i + 1 : 1; j <= W; ++j)
    	  swap(S[i][j], S[j][i]);
      swap(H, W), swap(horizon, vertical);
    }

    int temp = 0;
    for (int i = 1; i <= W; ++i)
      for (int j = 2; j <= H; ++j)
    	if (S[j][i] == '#' && S[j - 1][i] == '#') temp++;
    Matrix R = Matrix(1, 2), T = Matrix(2, 2);
    R.num[0][0] = R.num[0][1] = 1;
    T.num[0][1] = -temp, T.num[1][1] = tot, T.num[0][0] = vertical;
    for (; K; K >>= 1, T = T * T)
      if (K & 1) R = R * T;
    printf("%lld\n", (R.num[0][1] + MOD) % MOD);
  }
  
  return 0;
}
