//搜索,以及用了一下字符串
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
string s[25];
int n,tot;
int a[25][25];
bool b[25][25];
int num[25],maxm=0;
int find(int x,int y)
{
//搜索
for(int i=1;i<=n;i++)
{
if(b[x][i]==1&&num[i]<2)//两单词能连在一起并且此单词使用次数小于2次
{
y+=a[x][i];
num[i]++;
find(i,y);
num[i]--;//回溯
maxm=max(maxm,y);//查找最大值
y-=a[x][i];//回溯
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n+1;i++)cin>>s[i];
for(int i=1;i<=n;i++)
{
if(s[n+1].substr(0,1)==s[i].substr(0,1))
//string类型可以通过“==”判断是否相等
{
b[n+1][i]=1;a[n+1][i]=s[i].length()-1;
}
}
//查找首单词
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=s[i].length()-1;k>=1;k--)//倒序,这样找的最小重叠而不是最大重叠
{
if(s[j].substr(0,k)==s[i].substr(s[i].length()-k,k))
{
//判断两个单词是否有重叠
a[i][j]=s[j].length()-k;
b[i][j]=1;//在两个能连一起的单词加上边
}
}
}
}
find(n+1,0);//搜索从首字母开始
cout<<maxm+1;//把首字母的长度加上
return 0;
}