10
abdcced
bdacdac
ecb
dc
eaeeebdd
adcdbadcac
eb
aadecccde
edbaeacad
accd
 100
d
a
e
eb
c
d
d
e
c
e
ac
d
c
aa
a
e
da
e
e
c
e
a
c
c
bc
bd
d
da
cc
be
b
a
ee
d
be
be
e
b
a
ed
cb
ab
a
ea
ac
aa
ed
d
b
eb
e
ed
c
ce
c
d
c
d
d
ee
e
b
ea
ea
da
ab
ba
ed
da
ec
ea
bd
ee
dc
d
bd
d
c
cc
ab
bd
a
ad
e
d
e
bc
bb
c
bc
a
a
e
ca
ac
c
ad
c
be
d
 3
ab
acb
ba
 10
a
b
a
c
b
a
b
a
a
a
 5
cab
bbc
caa
ccc
aca
 3
ac
abc
ca
 5
ab
bc
cd
de
ffffffffff
 16
ddgcb
fgbhgbdg
gha
dh
ddfb
fggbc
edb
hd
d
hfgcabf
hdaef
fhbcdgba
chee
cafeggc
f
ecb
 50
agecd
cghafi
fiide
iecc
jbdcfjhgd
diee
hfeg
ehc
gfijgjh
gacaifebg
dicbbddc
hjgciaei
jjcdh
g
gc
cf
hfdjhd
c
icidbec
ji
eeh
cgeejggc
acfd
jjg
ajefdj
eghhebiic
bih
gbb
jjaa
idc
gafi
ecg
dbigbjiehj
cedif
ahidfaaajg
hfhhiccbgb
dgegjgieif
hgjebhfdc
j
ahehd
ahdah
bijbhh
a
dabiggfhac
dedigbjbf
ihbdj
iihagchd
gfebhfdi
jbjdcggdh
f

0
 35
 5
 6
 9
 5
 10
 7
 37



import java.util.Arrays;
import java.util.Scanner;

public class DynastyPuzzles 
{
	static int n;
	static String[] names;
	static int[] score; //lengthsofar
	static int[] bsfendingwith = new int[26]; //best-so-far reachable guy that ends with
	static int[] bsfstartingwith = new int[26]; //best-so-far reachable guy that ends with
	static boolean debug = false;
	
	static Scanner sc = new Scanner(System.in);
	
	static void initialize()
	{
		score = new int[n];
		for(int i = 0; i < 26; i++)
		{
			bsfendingwith[i] = -1;
			bsfstartingwith[i] = -1;
		}
	}
	
	public static void main(String[] args) 
	{
//		System.out.println((int)'a');
		
		n = sc.nextInt();
		
		names = new String[n];
		int ans = 0;
		
		for(int i = 0; i < n; i++)
		{
			names[i] = sc.next();
		}
		
		//d-d-d-do
		for(int firstKingLetter = 0; firstKingLetter < 26; firstKingLetter++)
		{
			initialize();
//			System.out.println("after in: " + Arrays.toString(bsfendingwith));
			
			for(int i = 0; i < n; i++)
			{
				String cur = names[i];
				char f = names[i].charAt(0);
				char l = names[i].charAt(names[i].length()-1);
				int prev = bsfendingwith[f-97];
				int curl = cur.length();
				
				if(prev == -1)
				{ //this can be a first king
					if(f-97 == firstKingLetter)
					{
						if(debug)System.out.println(cur + " can be first king, first letter is " + (char)f);
						
						int competition = bsfstartingwith[f-97];
						
						//even though no king leads to this, there may be other kings with the 
						//same starting letter.
						if(competition == -1 || curl > score[competition])
						{ //you beat the competition! become the best-so-far first king with this first letter!
							score[i] = curl;
						}
						else
						{
							score[i] = curl;
						} //dont judge me for this
					}
				}
				else
				{ //has a previous king that leads to this king (prev)
					score[i] = score[prev] + cur.length();
				}
				
				//update bsf
				if(score[i] > 0)
				{
					if(bsfstartingwith[f-97] == -1 || score[i] > score[bsfstartingwith[f-97]])
					{
						bsfstartingwith[f-97] = i;
					}
					if(bsfendingwith[l-97] == -1 || score[i] > score[bsfendingwith[l-97]])
					{
						bsfendingwith[l-97] = i;
					}
				}
				
				//is this valid as a last king?
				if(l-97 == firstKingLetter)
				{
					if(debug)System.out.println(cur + " is eligible " + score[i] + ", prev is " + prev);
					ans = Math.max(ans, score[i]);
				}
			}
			if(debug)if(ans>0)System.out.println(((char)(firstKingLetter+97)) + Arrays.toString(score));
		}
		
		System.out.println(ans);

	}

}
