#include <set>
#include <bitset>
#include <list>
#include <map>
#include <stack>
#include <queue>
#include <deque>
#include <string>
#include <vector>
#include <ios>
#include <iostream>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <utility>
#include <complex>
#include <numeric>
#include <functional>
#include <cmath>
#include <ctime>
#include <climits>
#include <cstdarg>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cctype>
#include <cassert>
#define lson rt << 1, l, m
#define rson rt << 1 | 1, m + 1, r
using namespace std;
const int INF = 0x7FFFFFFF;
const double EPS = 1e-10;
const double PI = 2 * acos (0.0);
const int MOD = 1e9 + 7;
const int maxn = 26;
const int nodemaxn = 50000 + 66;
char ss[2000000+maxn];
int cnt[1000+6];
char val[1000+6][66];
struct ACNode
{
int next[nodemaxn][maxn], pre[nodemaxn], last[nodemaxn], id[nodemaxn];
int root, len;
void Init ()
{
len = 0;
root = newnode ();
}
int newnode ()
{
for (int i = 0; i < maxn; i++)
next[len][i] = -1;
last[len] = id[len] = 0;
len++;
return len - 1;
}
void Insert (char *s, int ff)
{
int p = root;
for(int i = 0; s[i]; i++)
{
if(next[p][s[i]-'A'] == -1)
next[p][s[i]-'A'] = newnode ();
p = next[p][s[i]-'A'];
}
last[p]++;
id[p] = ff;
}
void Build ()
{
queue <int> qu;
pre[root] = root;
for(int i = 0; i < maxn; i++)
{
if(next[root][i] == -1)
next[root][i] = root;
else
{
pre[next[root][i]] = root;
qu.push (next[root][i]);
}
}
while (!qu.empty ())
{
int p = qu.front(); qu.pop ();
for (int i = 0; i < maxn; i++)
{
if (next[p][i] == -1)
next[p][i] = next[pre[p]][i];
else
{
pre[next[p][i]] = next[pre[p]][i];
qu.push (next[p][i]);
}
}
}
}
void Query (char *s)
{
int p = root;
for (int i = 0; s[i]; i++)
{
if (s[i] < 'A' || s[i] > 'Z')
p = root;
else
p = next[p][s[i]-'A'];//一步到位,重要!!! 当存在时走到下一层,否则回溯!!!
int temp = p;
while (temp != root)
{
if (last[temp])
{
cnt[id[temp]]++;
}
temp = pre[temp];
}
}
}
};
ACNode ac;
int main()
{
// freopen ("aaa.txt", "r", stdin);
int n;
while (scanf ("%d", &n) != EOF)
{
ac.Init ();
memset (cnt, 0, sizeof (cnt));
for (int i = 1; i <= n; i++)
{
scanf ("%s", val[i]);
ac.Insert (val[i], i);
}
ac.Build ();
gets (ss);
gets (ss);
ac.Query (ss);
for (int i = 1; i <= n; i++)
{
if (cnt[i])
printf ("%s: %d\n", val[i], cnt[i]);
}
}
return 0;
}