Branch Out - Monkey Edition
Java (JDK), 570 bytes



t-&gt;{return "Routes = "+Arrays.deepToString(Arrays.stream(r(t.get(0).get(0),t,t.get(0).get(0)).split("\\[")).filter(d-&gt;d.endsWith("]")).map(d-&gt;d.replaceAll("]", "")).map(d-&gt;d.split("(?=[A-Z])")).collect(Collectors.toList()).toArray());};String r(String s, List&lt;List&lt;String&gt;&gt;t, String b){List&lt;String&gt;o = t.stream().filter(e-&gt;e.get(0).equals(s)).map(e-&gt;e.get(1)).collect(Collectors.toList());if(s.matches("^S(?!(?:1)$)\\d+"))return s;if(o.size()&gt;1){String x="";for(String n:o){x+="["+b+r(n,t,b+n)+"]";}return x;}if(o.size()==1)return s+r(o.get(0),t,b+o.get(0));return "]";}


As you may notice by my code I´m still learning a lot every day.
My answer is neighter pretty nor short and I honestly even hope this works for different testcases even though I tested a couple.
But I hope that this question gets the attention it deserves and there will be more answers I can learn from.

INPUT

String[][] STEP = { { "S1", "B3" },  ... ,{ "B14", "T2" }, { "B14", "T10" } };
List&lt;List&lt;String&gt;&gt; tupels = Arrays.stream(STEP).map(Arrays::asList).collect(Collectors.toList());
z(tupels);


I converted your given Input into an 2D-Java-Array String[][] and converted that into a List&lt;List&lt;String&gt;&gt;.

CODE

The first method calls a recursive method to get all routes and formats the output.

t-&gt;{
return "Routes ="+Arrays.deepToString(
  Arrays.stream(r(t.get(0).get(0),t,t.get(0).get(0)).split("\\["))
 .filter(d-&gt;d.endsWith("]")).map(d-&gt;d.replaceAll("]", ""))
 .map(d-&gt;d.split("(?=[A-Z])")).collect(Collectors.toList()).toArray());
};


The second method is the recursive method which gathers all the possible routes

String r(String s, List&lt;List&lt;String&gt;&gt;t, String b){
  List&lt;String&gt;o =t.stream().filter(e-&gt;e.get(0).equals(s)).map(e-&gt;e.get(1))
  .collect(Collectors.toList());
  if(s.matches("^S(?!(?:1)$)\\d+"))
    return s;
  if(o.size()&gt;1){
    String x="";
    for(String n:o){
      x+="["+b+r(n,t,b+n)+"]";
    }
    return x;
  }
  if(o.size()==1)
    return s+r(o.get(0),t,b+o.get(0));
  return "]";
}  


Try it online!