#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,t,act,f[70],a[61][70][70],fc[70][70],cc[70][70];
string op[70];
int num(int i,int j){return (i-1)*m+j;}
void mul_qmi(int f[70],int a[70][70]){
int c[70];
memset(c,0,sizeof c);
for (int i=0;i<=n*m;i++){
for (int j=0;j<=n*m;j++){
c[i]=(c[i]+f[j]*a[j][i]);
}
}
memcpy(f,c,sizeof c);
}
void mul_qmi2(int a[70][70]){
int c[70][70];
memset(c,0,sizeof c);
for(int i=0;i<=n*m;i++){
for(int j=0;j<=n*m;j++){
for(int k=0;k<=n*m;k++){
c[i][j]=(c[i][j]+a[i][k]*a[k][j]);
}
}
}
memcpy(a,c,sizeof c);
}
void mul(int a[70][70],int b[70][70]){
int c[70][70];
memset(c,0,sizeof c);
for(int i=0;i<=n*m;i++){
for(int j=0;j<=n*m;j++){
for(int k=0;k<=n*m;k++){
c[i][j]=(c[i][j]+a[i][k]*b[k][j]);
}
}
}
memcpy(a,c,sizeof c);
}
signed main(){
cin>>n>>m>>t>>act;
f[0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char c;
cin>>c;
fc[i][j]=c-48;
}
}
for(int i=0;i<act;i++) cin>>op[i];
for(int t=1;t<=60;t++){
a[t][0][0]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
char opt=op[fc[i][j]][cc[i][j]];
if(isdigit(opt)){
a[t][num(i,j)][num(i,j)]=1;
a[t][0][num(i,j)]=opt-48;
}else if(opt=='N'&&1<i){
a[t][num(i,j)][num(i-1,j)]=1;
}else if(opt=='S'&&n>i){
a[t][num(i,j)][num(i+1,j)]=1;
}else if(opt=='W'&&1<j){
a[t][num(i,j)][num(i,j-1)]=1;
}else if(opt=='E'&&m>j){
a[t][num(i,j)][num(i,j+1)]=1;
}
cc[i][j]=(t+1)%(op[fc[i][j]].size());
}
}
}
int tmp[70][70];
for(int i=0;i<=n*m;i++){
for(int j=0;j<=n*m;j++){
tmp[i][j]=a[1][i][j];
}
}
for(int i=2;i<=60;i++) mul(tmp,a[i]);
f[0]=1;
int chk=t/60;
while(chk){
if(chk&1) mul_qmi(f,tmp);
mul_qmi2(tmp);
chk>>=1;
}
for(int i=1;i<=t%60;i++) mul_qmi(f,a[i]);
int ans=0;
for(int i=1;i<=n*m;i++) ans=max(ans,f[i]);
cout<<ans;
}