{
ZADATAK: Stampa
JEZIK: PASCAL
}
program stampa;
type string3=string[3];
     string2=string[2];

var n, k: integer;
    s: array [1..10000] of string2;
    z: array [1..10000] of string;
    c: char;
    s1: string;
    que: array [1..20000] of string3;
    kq, lq, iq: integer;
    b3: array [0..20000] of boolean;
    p: array [1..1000] of string[2];
    lp, finnum: integer;
    b2: array [0..1000] of boolean;
    asd: string3;

procedure load;
var i: integer;
begin
  readln(n, k);
  for i:=1 to n do
    readln(s[i], z[i]);
  readln(c);
  s1:='  '+c;
end;

procedure init;
var i: integer;
begin
  for i:=0 to 20000 do b3[i]:=false;
  for i:=0 to 1000 do  b2[i]:=false;
  kq:=1;
  que[1]:=s1;
  lq:=1;
  lp:=0;
  iq:=1;
end;

function value(c: char): integer;
begin
  if c=' ' then value:=0
  else value:=1+ord(c)-ord('a');
end;

function code(s: string3): integer;
var f, i, x: integer;
begin
  f:=0;    x:=1;
  for i:=3 downto 1 do
  begin
    f:=f+x*value(s[i]);
    x:=x*27;
  end;
  code:=f;
end;

function code2(s: string2): integer;
var f, i, x: integer;
begin
  f:=0;    x:=1;
  for i:=2 downto 1 do
  begin
    f:=f+x*value(s[i]);
    x:=x*27;
  end;
  code2:=f;
end;

procedure enque(rec: string);
var i: integer;
begin
  for i:=1 to length(rec)-2 do
  if not b3[code(copy(rec, i, 3))] then
  begin
    inc(iq);
    inc(lq);
    que[lq]:=copy(rec, i, 3);
  end;
end;


procedure obradi(x: integer);
var i: integer;
begin
  b3[code(que[x])]:=true;
  if not b2[code2(copy(que[x],1, 2))] then
  begin
    b2[code2(copy(que[x],1, 2))]:=true;
    inc(lp);
    p[lp]:=copy(que[x],1, 2);
  end;
  if not b2[code2(copy(que[x],2, 2))] then
  begin
    b2[code2(copy(que[x],2, 2))]:=true;
    inc(lp);
    p[lp]:=copy(que[x],2, 2);
  end;
  for i:=1 to n do
  begin
    if que[x][1]=s[i][1] then enque(z[i]+que[x][2]+que[x][3]);
    if que[x][2]=s[i][1] then enque(que[x][1]+z[i]+que[x][3]);
    if que[x][3]=s[i][1] then enque(que[x][1]+que[x][2]+z[i]);
  end;
end;


procedure solve;
var i: integer;
begin
  while iq>0 do
  begin
    if not b3[code(que[kq])] then
    begin
      obradi(kq);

    end;
    dec(iq);
      inc(kq);
  end;
end;

procedure count;
var i: integer;
begin
  finnum:=0;
  for i:=1 to lp do
  if (p[i][1]<>' ')and(p[i][2]<>' ')then
  inc(finnum);
end;

procedure print;
var i: integer;
begin
  writeln(finnum);
  for i:=1 to lp do
  if (p[i][1]<>' ')and(p[i][2]<>' ')then
  writeln(p[i]);
end;

procedure sort;
var pom: string2; i, j: integer;
begin
  for i:=1 to lp-1 do
    for j:=lp downto i+1 do
    if p[i]>p[j] then
    begin
      pom:=p[i];
      p[i]:=p[j];
      p[j]:=pom;
    end;
end;


begin{program}
  load;
  init;
  solve;
  sort;
  count;
  print;
end.
