#include <bits/stdc++.h>
#define MOD 1000000007LL
using namespace std;
typedef long long ll;
typedef pair<int,int> P;

int n,m,k,K;
vector<string> vs,vs2;
string f[255],t[255],ss[255];
int fid[255],tid[255],tid2[255];
int nxt[601][26];
short wnxt[601][605];
short wcnt[601][605];
vector<P> vec[255];
vector<short> v2[605][605];
int cnt[601];

void init(){
	vector<string> pfx;
	for(int i=0;i<k;i++){
		for(int j=0;j<=ss[i].size();j++){
			pfx.push_back(ss[i].substr(0,j));
		}
	}
	sort(pfx.begin(),pfx.end());
	pfx.erase(unique(pfx.begin(),pfx.end()),pfx.end());
	K=pfx.size();
	for(int i=0;i<K;i++){
		cnt[i]=0;
		for(int j=0;j<k;j++){
			if(ss[j].size()<=pfx[i].size() && pfx[i].substr(pfx[i].size()-ss[j].size(),ss[j].size())==ss[j])cnt[i]++;
		}
		for(int j=0;j<26;j++){
			string s=pfx[i];
			s+=('a'+j);
			int kk=0;
			while(1){
				kk=lower_bound(pfx.begin(),pfx.end(),s)-pfx.begin();
				if(kk<K && pfx[kk]==s)break;
				s=s.substr(1);
			}
			nxt[i][j]=kk;
		}
	}
	for(int i=0;i<vs2.size();i++){
		for(int j=0;j<K;j++){
			int cur=j;
			int ccnt=0;
			for(int l=0;l<vs2[i].size();l++){
				cur=nxt[cur][(vs2[i][l]-'a')];
				ccnt+=cnt[cur];
			}
			wnxt[i][j]=cur;
			wcnt[i][j]=ccnt;
		}
	}
}

int dp[25][251][601][2];

void solve(){
	for(int i=0;i<n;i++){
		cin >> f[i] >> t[i];
		vs.push_back(f[i]);
		vs2.push_back(f[i]);
		vs2.push_back(t[i]);
	}
	vs.push_back("");
	sort(vs.begin(),vs.end());
	vs.erase(unique(vs.begin(),vs.end()),vs.end());
	sort(vs2.begin(),vs2.end());
	vs2.erase(unique(vs2.begin(),vs2.end()),vs2.end());
	for(int i=0;i<n;i++){
		fid[i]=lower_bound(vs.begin(),vs.end(),f[i])-vs.begin();
		tid[i]=lower_bound(vs.begin(),vs.end(),t[i])-vs.begin();
		tid2[i]=lower_bound(vs2.begin(),vs2.end(),t[i])-vs2.begin();
		if(tid[i]==vs.size() || vs[tid[i]]!=t[i]){
			v2[fid[i]][t[i].size()].push_back(tid2[i]);
		}else{
			vec[fid[i]].push_back(P(tid[i],tid2[i]));
		}
	}
	for(int i=1;i<vs.size();i++){
		int v=lower_bound(vs2.begin(),vs2.end(),vs[i])-vs2.begin();
		vec[0].push_back(P(i,v));
	}
	for(int i=0;i<k;i++){
		cin >> ss[i];
	}
	init();
	int ans=0;
	for(int i=0;i<vs2.size();i++){
		int v=lower_bound(vs.begin(),vs.end(),vs2[i])-vs.begin();
		if(v==vs.size() || vs[v]!=vs2[i]){
			if(vs2[i].size()==m && wcnt[i][0]==1)ans++;
		}
	}
	dp[0][0][0][0]=1;
	for(int i=0;i<m;i++){
		for(int j=0;j<vs.size();j++){
			for(int k=0;k<K;k++){
				for(int l=0;l<2;l++){
					int val=dp[i%25][j][k][l];
					if(val==0)continue;
					for(int a=0;a<vec[j].size();a++){
						P p=vec[j][a];
						int ni=i+vs[p.first].size();
						if(ni>m)continue;
						ni%=25;
						int nj=p.first;
						int nk=wnxt[p.second][k];
						int nl=wcnt[p.second][k]+l;
						if(nl>=2)continue;
						dp[ni][nj][nk][nl]+=val;
						if(dp[ni][nj][nk][nl]>=MOD){
							dp[ni][nj][nk][nl]-=MOD;
						}
					}
					for(int a=0;a<v2[j][m-i].size();a++){
						int p=v2[j][m-i][a];
						int nl=wcnt[p][k]+l;
						if(nl>=2 || nl==0)continue;
						ans+=val;
						if(ans>=MOD){
							ans-=MOD;
						}
					}
				}
			}
		}
		for(int j=0;j<vs.size();j++){
			for(int k=0;k<K;k++){
				for(int l=0;l<2;l++){
					dp[i%25][j][k][l]=0;
				}
			}
		}
	}
	
	for(int i=0;i<vs.size();i++){
		for(int j=0;j<K;j++){
			ans+=dp[m%25][i][j][1];
			if(ans>=MOD)ans-=MOD;
		}
	}
	for(int i=0;i<25;i++){
		for(int j=0;j<vs.size();j++){
			for(int k=0;k<K;k++){
				for(int l=0;l<2;l++){
					dp[i][j][k][l]=0;
				}
			}
		}
	}
	printf("%d\n",ans);
} 


int main(void){
	while(1){
		scanf("%d%d%d",&n,&m,&k);
		if(n==0 && m==0 && k==0)break;
		for(int i=0;i<vs.size();i++){
			vec[i].clear();
		}
		for(int i=0;i<vs2.size();i++){
			for(int j=0;j<21;j++){
				v2[i][j].clear();
			}
		}
		vs.clear();
		vs2.clear();
		solve();
	}
	
}


Measured memory_bytes: 42728