/*
poj3691 AC自动机 dp
lcy 2017-9-24
给出多个危险基因串,再给出一个基因串,求最少修改几次基因串使得其上不包含危险基因串。
dp部分已给出超详细注释
最重要的一点,AC自动机上的每个点都对应一个状态,状态之间通过字符转移。(个人粗浅理解)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <vector>
#include <queue>
#include <cmath>
#include <algorithm>
#include <map>
#include <bitset>
using namespace std;
#define ll long long
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define frr(i,a,b) for(int i=a;i>=b;i--)
#define ms(a,b) memset(a,b,sizeof(a))
#define scfd(a) scanf("%d",a)
#define scflf(a) scanf("%lf",a)
#define scfs(a) scanf("%s",a)
#define ptfd(a) printf("%d\n",a)
#define ptfs(a) printf("%s\n",a)
#define showd(a,b) printf(a"=%d\n",b)
#define showlf(a,b) printf(a"=%lf\n",b)
#define shows(a,b) printf(a"=%s\n",b)
#define mmcp(a,b) memcpy(a,b,sizeof(b))
const int MAXN=1005;
const ll INF=999999999ll;
ll dp[MAXN][MAXN];
int ch[MAXN][4],f[MAXN],nd[MAXN],sz;
bool end[MAXN],last[MAXN];
char s[MAXN];
int idx(char x){
switch(x){
case 'A':
return 0;
case 'C':
return 1;
case 'G':
return 2;
case 'T':
return 3;
}
}
void insert(char *s){
int l=strlen(s),nnd=0;
fr(i,0,l-1){
int j=idx(s[i]);
if(!ch[nnd][j]){
ch[nnd][j]=sz;
nd[sz++]=j;
}
nnd=ch[nnd][j];
}
last[nnd]=end[nnd]=true;
}
void build(){
queue<int>q;
fr(i,0,3)
if(ch[0][i])
q.push(ch[0][i]);
while(!q.empty()){
int nnd=q.front();q.pop();
fr(i,0,3){
int faf=f[nnd];
while(faf&&!ch[faf][i]){faf=f[faf];}
if(!ch[nnd][i]){
ch[nnd][i]=ch[faf][i];
continue;
}
f[ch[nnd][i]]=ch[faf][i];
if(end[ch[nnd][i]]||last[f[ch[nnd][i]]])
last[ch[nnd][i]]=true;
q.push(ch[nnd][i]);
}
}
}
void init(){
fr(i,0,MAXN-1)
fr(j,0,MAXN-1)
dp[i][j]=INF;
ms(ch,0);
ms(f,0);
sz=1;
ms(end,false);
ms(last,false);
}
void solve(){
//状态 dp[i][j] s[1...i]走到状态节点j时最少修改几次
dp[0][ch[0][idx(s[0])]]=0;//不改变第1个字符
//开始时如果第1个字符不变,那么dp[0][当前状态编号]值为0
fr(i,0,3)//改变第1个字符
dp[0][ch[0][i]]=min(dp[0][ch[0][i]],1ll);
//如果变第1个字符为i,那么dp[0][当前状态编号]值为1,即改变了1位
int l=strlen(s);
fr(i,1,l-1)//当前字符的位置,注意每次是从i-1位置开始递推i
fr(j,0,sz-1)//枚举状态编号,AC自动机上每个点都是一个状态。根节点意味着当前没有一个字符匹配成功,而其他节点意味着
//已经有部分字符得到匹配。走到一个节点,意味着当前字符串到达了一个新状态。状态之间的转移是靠添加字符完成的。
if(!last[j]){
ll p=dp[i-1][j];
int k=idx(s[i]);
if(!last[ch[j][k]])//如果这个节点是危险节点(是单词的结尾或通过fail指针间接与某个单词结尾相连),那么不用处理
dp[i][ch[j][k]]=min(dp[i][ch[j][k]],p);//在第i个字符处走到下一个位置,且改变的总次数不变,为p
fr(kk,0,3)//改变第i个字符为kk
if(!last[ch[j][kk]])//同样不考虑危险节点
dp[i][ch[j][kk]]=min(dp[i][ch[j][kk]],p+1);
}
}
int n,cases;
int main(){
while(~scfd(&n)&&n){
init();
fr(i,0,n-1){
scfs(s);
insert(s);
}
scfs(s);
build();
solve();
ll ans=INF;
fr(i,0,sz-1)
ans=min(ans,dp[strlen(s)-1][i]);//最终答案是最后一个字符处在所有状态的改变量中最小的那一个
if(ans==INF)
printf("Case %d: -1\n",++cases);
else
printf("Case %d: %lld\n",++cases,ans);
}
}