/*#include <bits/stdc++.h>
using namespace std;
int n,no[21];
string s[21],mx,now,n1,n2;
char c;
void dfs(string s2){
for(int h=1;h<=s2.size();h++){
for(int i=1;i<=n;i++){
n1="";
n2="";
if(s[i]==s2)continue;
for(int y=0;y<h;y++){
n1+=s[i][y];
n2+=s2[y];
}
if(n1==n2){
if(no[i]==2)continue;
no[i]++;
now=s[i]-n1+s2;
if(mx<now)mx=now;
dfs(now);
}
}
}
}
int main(){
cin>>n;
for(int j=1;j<=n;j++){
cin>>s[j];
}
cin>>c;
for(int j=1;j<=n;j++){
if(s[j][0]==c){
dfs(s[j]);
}
}
cout<<mx.size();
return 0;
}*/
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int n;
int used[21];
string words[21];
string maxStr;
// 计算拼接后的字符串
string merge(const string& a, const string& b) {
for (int i = 1; i < min(a.size(), b.size()); ++i) {
if (a.substr(a.size() - i) == b.substr(0, i)) {
return a + b.substr(i);
}
}
return "";
}
void dfs(const string& current) {
if (current.size() > maxStr.size()) {
maxStr = current;
}
for (int i = 0; i < n; ++i) {
if (used[i] >= 2) continue;
string newStr = merge(current, words[i]);
if (!newStr.empty()) {
used[i]++;
dfs(newStr);
used[i]--;
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; ++i) {
cin >> words[i];
}
char start;
cin >> start;
for (int i = 0; i < n; ++i) {
if (words[i][0] == start) {
used[i]++;
dfs(words[i]);
used[i]--;
}
}
cout << maxStr.size() << endl;
return 0;
}
/**************************************************************
Problem: 1864
User: zhouhongyi
Language: C++
Result: Accepted
Time:26 ms
Memory:2080 kb
****************************************************************/