//↓满分DFS
void dfs(int a){
    qn[a]=1;
    for(int i=1;i<=n;i++){
        if(nn[a][nn[a].length()-1]==nn[i][0]&&qn[i]==0){
            if(ans[a]+nn[i].length()>ans[i]){
                ans[i]=ans[a]+nn[i].length();
                dfs(i);
                qn[i]=0;
            }
        }
    }
}
/*
qn数组标记当前传进来的第a位字符串,已被使用
遍历1-n,按照题意nn[a][nn[a].length()-1]==nn[i][0],而且第i位字符串没有被使用过
进入第二个if,如果当前传进来的第a位(第a位字符串的长度)加上遍历的第i位的字符串长度,大于第i位ans数组中的数字(ans除了一开始传进去的第一个a,其他都为0),进入
ans[i]=ans[a]+nn[i].length();
从第i位继续搜索,即现在字符串最后的一个字母变成了第i位字符串的最后一位,此时ans数组中的第i位装着,目前为止拼接了的字符串的最大长度
最后回溯
*/
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)cin >> nn[i];//读入数据


    for(int i=1;i<=n;i++){
        ans[i]=nn[i].length();//每一次循环,ans数组都清,并将第i位初始化为第i位字符串的长度
        dfs(i);//第i位为起点,dfs
        for(int j=1;j<=n;j++)com=max(ans[j],com);//在已经在dfs中赋值好的ans数组中寻找最大值
        memset(qn,0,sizeof(qn));
        memset(ans,0,sizeof(ans));
	//将ans和qn两个数组清空,方便下一个位置的字符串作为开头,搜索使用
        //for(int j=0;j<20;j++)printf("%d ",qn[j]);
    }
    printf("%d",com);//输出结果
    
    
    return 0;
}