use 5.20.0; use warnings; use experimental qw/ signatures postderef /; use Graph::Directed; my $g = Graph::Directed->new; while(<>) { /Step (.).*before step (.)/; $g->add_edge( $1 => $2 ); } while( my @x = sort $g->predecessorless_vertices ) { print $x[0]; $g->delete_vertex($x[0]); }