#include<bits/stdc++.h>
#define _for(i,a,b) for(int i=a;i<b;i++)
using namespace std;
const int maxnode = 400000 + 5;
const int sigama_size = 26;
const int maxn = 300000 + 3;
const int MOD = 20071027;
char s[maxn];
struct Trie{
int ch[maxnode][sigama_size];
int val[maxnode];
int sz;
void clear(){
sz = 1;
memset(ch[0], 0, sizeof(ch[0]));
}
int idx(char c){
return c - 'a';
}
void insert(char *s, int v){
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++){
int c = idx(s[i]);
if(!ch[u][c]){ //the node does not exist
memset(ch[sz], 0, sizeof(ch[sz]));
ch[u][c] = sz;
val[sz] = 0;
sz++;
}
u = ch[u][c];
}
val[u] = v;
}
bool query(char *s){
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++){
int c = idx(s[i]);
if(!ch[u][c]) return false;
else u = ch[u][c];
}
return val[u];
}
void query2(char* s, vector<int>&layers){
int u = 0, n = strlen(s);
for(int i = 0; i < n; i++){
int c = idx(s[i]);
if(!ch[u][c]) return ;
if(val[ch[u][c]]){
layers.push_back(i);
}
u = ch[u][c];
}
}
};
Trie trie;
// d[i] = sum{d[i+len(x)] | x is prefix of S[i...L]}
int solve(char* s)
{
int n = strlen(s);
int d[n+1];
memset(d, 0, sizeof(d));
d[n] = 1;
for(int i = n - 1; i >= 0; i--){
vector<int>layers;
trie.query2(s + i, layers);
for(int j = 0; j < layers.size(); j++)
d[i] = (d[i] + d[i+layers[j]+1]) % MOD;
}
return d[0];
}
int main()
{
int kase = 0, n;
while(scanf("%s%d", s, &n) == 2){
trie.clear();
while(n--){
char word[102];
scanf("%s", word);
trie.insert(word, 1);
}
printf("Case %d: %d\n", ++kase, solve(s));
}
return 0;
}