#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+10;
const int mod=1e9+7;
int gi() {
    int x=0,o=1;char ch=getchar();
    while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    if(ch=='-') o=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
    return x*o;
}
struct matrix {
    int val[3][3];
    matrix() { memset(val,0,sizeof(val)); }
    int* operator[](int x) { return val[x]; }
    void init() { val[1][1]=val[2][2]=1; }
} S,T;
matrix operator*(matrix a,matrix b) {
    matrix ret;
    for(int i=1;i<=2;i++)
        for(int j=1;j<=2;j++)
            for(int k=1;k<=2;k++) ret[i][j]=(ret[i][j]+1ll*a[i][k]*b[k][j]%mod)%mod;
    return ret;
}
int qpow(int a,ll b) {
    int ret=1;
    while(b) {
        if(b&1) ret=1ll*ret*a%mod;
        a=1ll*a*a%mod; b>>=1;
    }
    return ret;
}
matrix qpow(matrix a,ll b) {
    matrix ret;ret.init();
    while(b) {
        if(b&1) ret=ret*a;
        a=a*a; b>>=1;
    }
    return ret;
}
int n,m;
ll k;
char s[N][N];
int main() {
    cin>>n>>m>>k;
    for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
    if(k==1) return puts("1"),0;
    int v=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++) if(s[i][j]=='#') v++;
    int lr=0,ud=0;
    for(int i=1;i<=n;i++) if(s[i][1]=='#'&&s[i][m]=='#') lr++;
    for(int i=1;i<=m;i++) if(s[1][i]=='#'&&s[n][i]=='#') ud++;
    if(lr&&ud) return puts("1"),0;
    if(!lr&&!ud) return printf("%d\n",qpow(v,k-1)),0;
    int ev=0;
    if(lr) {
        for(int i=1;i<=n;i++)
            for(int j=1;j<m;j++) if(s[i][j]=='#'&&s[i][j+1]=='#') ev++;
    }
    else {
        for(int i=1;i<n;i++)
            for(int j=1;j<=m;j++) if(s[i][j]=='#'&&s[i+1][j]=='#') ev++;
    }
    int V=qpow(v,k-1);
    S[1][1]=1;S[1][2]=0;
    T[1][1]=v;T[1][2]=ev;T[2][2]=lr+ud;
    int E=(S*qpow(T,k-1))[1][2];
    printf("%d\n",(V-E+mod)%mod);
    return 0;
}
//orzgzy
//鸡贼明年进队超稳
