{
ZADATAK: stampa
JEZIK: PASCAL
}
Program stamparija;
type niz=array[1..1000] of longint;
		 mat=array[1..26,1..26,1..26] of integer;
		 niz1=array[1..100] of char;
		 mat1=array[1..26,1..26] of longint;

var c,poc,z:char;
		br,i,j,l,k,n,pok,tren,tren1,pok1,broj:longint;
		f:text;
		S:niz1;
		B,Mark,R,X,Y:niz;
		T:mat;
		E,Pocetak,Kraj:mat1;
		nadjen:boolean;



procedure prebaci(c:char);
	begin
		br:=ord(c)-ord('a')+1
	end;

procedure prebaci1(br:longint);
	begin
		c:=chr(ord('a')+br-1)
	end;

begin
	for i:=1 to 26 do
		for j:=1 to 26 do
			for l:=1 to 26 do
				T[i,j,l]:=0;

	for i:=1 to 26 do
		Mark[i]:=0;
	for i:=1 to 26 do
		for j:=1 to 26 do
			begin
				Pocetak[i,j]:=0;
				Kraj[i,j]:=0;
				E[i,j]:=0
			end;


	{assign(f,'test.dat');
	reset(f); }
	read(n);
	readln(k);
	for j:=1 to n do
		begin
			read(c);
			read(z);
			for i:=1 to k-1 do
				read(S[i]);
			readln(S[k]);
			for i:=1 to k do
				begin
					prebaci(S[i]);
					B[i]:=br
				end;
			prebaci(c);
			for i:=1 to k-1 do
				T[br,B[i],B[i+1]]:=1;
			Pocetak[br,B[1]]:=1;
			Kraj[br,B[k]]:=1
		end;
	read(poc);
	{close(f);}


	pok:=1;
	prebaci(poc);
	R[1]:=br;
	tren:=1;
	tren1:=0;
	pok1:=1;
	nadjen:=true;
	while nadjen do
		begin


	nadjen:=false;
	while pok<=tren do
		begin
			for i:=1 to 26 do
				for j:=1 to 26 do
					if T[R[pok],i,j]=1
					then
						begin
							if E[i,j]=0
							then
								begin
									tren1:=tren1+1;
									X[tren1]:=i;
									Y[tren1]:=j
								end;
							E[i,j]:=1;
							if Mark[i]=0
							then
								begin
									Mark[i]:=1;
									tren:=tren+1;
									R[tren]:=i;
								end;
							if Mark[j]=0
							then
								begin
									Mark[j]:=1;
									tren:=tren+1;
									R[tren]:=j;
								end;
						end;
			pok:=pok+1
		end;


	while pok1<=tren1 do
		begin
			for i:=1 to 26 do
				for j:=1 to 26 do
					begin
						if (Kraj[X[pok1],i]=1) and (Pocetak[Y[pok1],j]=1) and (E[i,j]=0)
						then
							begin

										tren1:=tren1+1;
										X[tren1]:=i;
										Y[tren1]:=j;

								E[i,j]:=1;
								if Mark[i]=0
								then
									begin
										tren:=tren+1;
										R[tren]:=i;
										Mark[i]:=1;
										nadjen:=true;
									end;
								if Mark[j]=0
								then
									begin
										tren:=tren+1;
										R[tren]:=j;
										Mark[j]:=1;
										nadjen:=true;
									end;
							end;
					end;

			for j:=1 to 26 do
					begin
						if (Pocetak[Y[pok1],j]=1) and (E[X[pok1],j]=0)
						then
							begin
								E[X[pok1],j]:=1;
								tren1:=tren1+1;
								X[tren1]:=X[pok1];
								Y[tren1]:=j;
								if Mark[j]=0
								then
									begin
										tren:=tren+1;
										R[tren]:=j;
										Mark[j]:=1;
										nadjen:=true
									end
							end
					end;

			for i:=1 to 26 do
					begin
						if (Kraj[X[pok1],i]=1) and (E[i,Y[pok1]]=0)
						then
							begin
								E[i,Y[pok1]]:=1;
								tren1:=tren1+1;
								X[tren1]:=i;
								Y[tren1]:=Y[pok1];
								if Mark[i]=0
								then
									begin
										tren:=tren+1;
										R[tren]:=i;
										Mark[i]:=1;
										nadjen:=true
									end
							end
					end;





			pok1:=pok1+1;
		end;



		end;





	{assign(f,'test.out');
	rewrite(f);
	for i:=1 to 26 do
		begin
			for j:=1 to 26 do
				write(f,E[i,j]);
			writeln(f)
		end;
	close(f);}

	broj:=0;
	for i:=1 to 26 do
		for j:=1 to 26 do
			if E[i,j]=1
			then
				broj:=broj+1;

	writeln(broj);
	for i:=1 to 26 do
		for j:=1 to 26 do
			if E[i,j]=1
			then
				begin
					prebaci1(i);
					write(c);
					prebaci1(j);
					writeln(c)
				end;







end.