import static java.lang.Math.*; import static java.util.Arrays.*; import java.util.*; public class Main { Scanner sc = new Scanner(System.in); int MOD = 1000000007; int L = 20; void run() { for (;;) { int N = sc.nextInt(), M = sc.nextInt(), K = sc.nextInt(); if ((N|M|K) == 0) return; String[] from = new String[N], to = new String[N]; for (int i = 0; i < N; i++) { from[i] = sc.next(); to[i] = sc.next(); } String[] kigo = new String[K]; for (int i = 0; i < K; i++) kigo[i] = sc.next(); sort(kigo); TreeSet set = new TreeSet(); for (int i = 0; i < N; i++) { set.add(from[i]); set.add(to[i]); } String[] word = set.toArray(new String[0]); int wordN = word.length; int[] ss = new int[N], ts = new int[N]; for (int i = 0; i < N; i++) { ss[i] = binarySearch(word, from[i]); ts[i] = binarySearch(word, to[i]); } set.clear(); set.add(""); for (int i = 0; i < K; i++) { for (int j = 0; j < kigo[i].length(); j++) set.add(kigo[i].substring(0, j + 1)); } String[] pre = set.toArray(new String[0]); int preN = pre.length; int[] end = new int[preN]; for (int i = 0; i < preN; i++) { for (int j = 0; j < pre[i].length(); j++) if (binarySearch(kigo, pre[i].substring(j)) >= 0) end[i]++; } int[][] nextC = new int[preN][26]; for (int i = 0; i < preN; i++) { for (int j = 0; j < 26; j++) { String s = pre[i] + (char)('a' + j); while (binarySearch(pre, s) < 0) s = s.substring(1); nextC[i][j] = binarySearch(pre, s); } } int[][] nextW = new int[preN][wordN]; int[][] endW = new int[preN][wordN]; for (int i = 0; i < preN; i++) { for (int j = 0; j < wordN; j++) { int p = i, e = 0; for (char c : word[j].toCharArray()) { p = nextC[p][c - 'a']; e += end[p]; } nextW[i][j] = p; endW[i][j] = e; } } int[][][][] dp = new int[L + 1][2][wordN][preN]; for (int i = 0; i < wordN; i++) { if (endW[0][i] <= 1) dp[word[i].length()][endW[0][i]][i][nextW[0][i]]++; } for (int len = 1; len < M; len++) { int crt = len % (L + 1), last = (len + L) % (L + 1); for (int i = 0; i < wordN; i++) for (int j = 0; j < preN; j++) dp[last][0][i][j] = dp[last][1][i][j] = 0; for (int k = 0; k < 2; k++) { for (int i = 0; i < N; i++) { int s = ss[i], t = ts[i]; for (int j = 0; j < preN; j++) { int num = dp[crt][k][s][j]; if (num > 0) { int len2 = (len + word[t].length()) % (L + 1), j2 = nextW[j][t], k2 = k + endW[j][t]; if (k2 <= 1) { dp[len2][k2][t][j2] += num; if (dp[len2][k2][t][j2] >= MOD) dp[len2][k2][t][j2] -= MOD; } } } } } } int crt = M % (L + 1); int res = 0; for (int i = 0; i < wordN; i++) for (int j = 0; j < preN; j++) { res += dp[crt][1][i][j]; if (res >= MOD) res -= MOD; } System.out.println(res); } } public static void main(String[] args) { new Main().run(); } }