import Ġjava . util .* Ċ Ċ private Ġdata Ġclass ĠNode ( val Ġname : ĠString ) Ġ{ ĊĠ Ġfun Ġcan Be Vis ited Multiple Times (): ĠBoolean Ġ= Ġname . first (). is UpperCase () Ċ } Ċ Ċ private Ġdata Ġclass ĠPath Status ( val Ġcurrent : ĠNode , Ġval Ġvisited : ĠSet < Node >) Ċ Ċ fun Ġmain () Ġ{ ĊĠ Ġval Ġs Ġ= ĠScanner ( System .` in `). use Delimiter (""" [\ n - ] """) ĊĠ Ġval Ġconnections Ġ= Ġmutable Map Of < Node , ĠSet < Node >>() ĊĠ Ġwhile Ġ( s . hasNext ()) Ġ{ ĊĠĠĠ Ġval Ġa Ġ= ĠNode ( s . next ()) ĊĠĠĠ Ġval Ġb Ġ= ĠNode ( s . next ()) ĊĠĠĠ Ġconnections [ a ] Ġ= Ġconnections . get OrDefault ( a , Ġset Of ()) Ġ+ Ġb ĊĠĠĠ Ġconnections [ b ] Ġ= Ġconnections . get OrDefault ( b , Ġset Of ()) Ġ+ Ġa ĊĠ Ġ} ĊĊĠ Ġval Ġqueue Ġ= ĠArray Deque < Path Status >() ĊĠ Ġvar Ġpaths ToEnd Ġ= Ġ 0 ĊĠ Ġval Ġstart Status Ġ= ĠPath Status ( Node (" start "), Ġset Of ( Node (" start "))) ĊĠ Ġqueue . add ( start Status ) ĊĊĠ Ġwhile Ġ( queue . isNotEmpty ()) Ġ{ ĊĠĠĠ Ġval Ġstatus Ġ= Ġqueue . remove First () ĊĠĠĠ Ġfor Ġ( next Ġin Ġconnections . get OrDefault ( status . current , Ġset Of ())) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( next . can Be Vis ited Multiple Times () Ġ|| Ġnext Ġ! in Ġstatus . visited ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Status Ġ= ĠPath Status ( next , Ġstatus . visited Ġ+ Ġnext ) ĊĠĠĠĠĠĠĠ Ġif Ġ( next . name Ġ!= Ġ" end ") Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġqueue . add Last ( next Status ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġpaths ToEnd ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprintln ( paths ToEnd ) Ċ } Ċ