/*#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
****************************************************************/