#include<cstdio>
#include<iostream>
#include<queue>
#include<string>
#include<map>
#include<utility>
#include<algorithm>

using namespace std;

typedef pair<int,int> P;

int getNum(char ch){
	return ch-'a';
}

struct PMA{
	struct node{
		int to[26];
		int fail;
		int leaf;//0,1,or2(>=2)
		node(){
			for(int i=0;i<26;i++) to[i]=-1;
			fail=-1;
			leaf=0;
		}
	};
	node nodes[700];
	int c;
	P moved[650][500];
	void init(){
		c=1;
		for(int i=0;i<700;i++) nodes[i]=node();
		for(int i=0;i<650;i++) for(int j=0;j<501;j++) moved[i][j]=make_pair(-1,-1);
	}
	void add(string str){
		int cur=0;
		for(int i=0;i<str.size();i++){
			int num=getNum(str[i]);
			if(nodes[cur].to[num]==-1){
				nodes[cur].to[num]=c;
				cur=c;
				c++;
			}else{
				cur=nodes[cur].to[num];
			}
		}
		nodes[cur].leaf=min(nodes[cur].leaf+1,2);
	}
	void getFail(){
		queue<int> que;
		for(int i=0;i<26;i++){
			if(nodes[0].to[i]!=-1){
				nodes[nodes[0].to[i]].fail=0;
				que.push(nodes[0].to[i]);
			}
		}
		while(!que.empty()){
			int r=que.front();
			que.pop();
			for(int i=0;i<26;i++){
				if(nodes[r].to[i]!=-1){
					int u=nodes[r].to[i];
					que.push(u);
					int v=nodes[r].fail;
					while(v!=0&&nodes[v].to[i]==-1){
			//			printf("v=%d\n",v);
						v=nodes[v].fail;
					}
					if(nodes[v].to[i]==-1) nodes[u].fail=0;
					else nodes[u].fail=nodes[v].to[i];
					int f=nodes[u].fail;
					nodes[u].leaf=min(nodes[u].leaf+nodes[f].leaf,2);
				}
			}
		}
	}
	pair<int,int> move(int v,string str,int id){
		if(moved[v][id]!=P(-1,-1)) return moved[v][id];
	///	bool flg=(str=="negawakuha");
	//	if(flg) cout<<v<<" "<<str<<"\n";
		int cur=v;
		int res=0;
		for(int i=0;i<str.size();i++){
			int num=getNum(str[i]);
			while(cur!=0&&nodes[cur].to[num]==-1) cur=nodes[cur].fail;
			if(nodes[cur].to[num]==-1){}
			else{
				cur=nodes[cur].to[num];
			}
			res+=nodes[cur].leaf;
		}
	//	if(flg) cout<<cur<<" "<<res<<"\n";
		moved[v][id]=make_pair(cur,res);
		return make_pair(cur,res);
	}
};

PMA pma;

int dp[21][650][500][2];

const long long mod=1000000007;

map<string,int> mp;
int sz[501];
vector<int> to[501];
string strs[501];

int main(){
	int N,M,K;
	while(true){
		pma.init();
		cin>>N>>M>>K;
		mp.clear();
		for(int i=0;i<501;i++) to[i].clear();
		if(N==0&&M==0&&K==0) break;
		for(int i=0;i<N;i++){
			string from,to;
			cin>>from>>to;
			if(mp.count(from)==0){
				int a=mp.size();
				mp[from]=a;
				sz[a]=from.size();
				strs[a]=from;
			}
			if(mp.count(to)==0){
				int a=mp.size();
				mp[to]=a;
				sz[a]=to.size();
				strs[a]=to;
			}
			::to[mp[from]].push_back(mp[to]);
		}
	//	for(int i=0;i<mp.size();i++){
	//		cout<<i<<" "<<strs[i]<<"\n";
	//	}
	//	printf("b\n");
		for(int i=0;i<K;i++){
			string str;
			cin>>str;
	//		cout<<"add:"<<str<<"\n";
			pma.add(str);
		}
	//	printf("c\n");
		pma.getFail();
	//	printf("d\n");
	//	for(int i=0;i<mp.size();i++){
	//		cout<<strs[i]<<"->";
	//		for(int j=0;j<to[i].size();j++){
	//			cout<<strs[to[i][j]]<<" ";
	//		}
	//		cout<<"\n";
	//	}
		int C=pma.c;
		for(int l=0;l<21;l++) for(int i=0;i<C;i++) for(int j=0;j<=mp.size();j++) for(int k=0;k<2;k++){
			dp[l][i][j][k]=0;
		}
		for(int i=0;i<mp.size();i++){
			pair<int,int> p=pma.move(0,strs[i],i);
			if(p.second>=2) continue;
			dp[sz[i]][p.first][i][p.second]=1;
		}
	//	printf("a\n");
		for(int l=1;l<M;l++){
			for(int v=0;v<C;v++){
				for(int w=0;w<mp.size();w++){
					for(int b=0;b<2;b++){
						for(int i=0;i<to[w].size();i++){
							int nw=to[w][i];
							int nl=(l+sz[nw])%21;
							pair<int,int> p=pma.move(v,strs[nw],nw);
							int nv=p.first;
							int nb=b+p.second;
							if(nb>=2) continue;
							dp[nl][nv][nw][nb]+=dp[l%21][v][w][b];
							dp[nl][nv][nw][nb]%=mod;
		//					if(dp[l%21][v][w][b]!=0){
		//						printf("(%d,%d,%d,%d)->(%d,%d,%d,%d)\n",
		//							l,v,w,b,l+sz[nw],nv,nw,nb);
		//					}
						}
					}
				}
			}
			for(int v=0;v<C;v++){
				for(int w=0;w<mp.size();w++){
					for(int b=0;b<2;b++){
						dp[l%21][v][w][b]=0;
					}
				}
			}
		}
		long long ans=0;
		for(int v=0;v<C;v++){
			for(int w=0;w<mp.size();w++){
				ans+=dp[(M%21)][v][w][1];
				ans%=mod;
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}

Measured memory_bytes: 57292