root(n0).

redundantEdge(X,Y,C) :- edge(X,Y,C), edge(X,Y,C1), C>C1.

node(X):-edge(X,_,_).
node(X):-edge(_,X,_).

in_tree(X,Y,C) v out_tree(X,Y) :-
	edge(X,Y,C),
	not redundantEdge(X,Y,C),
	reached(X).

:- root(X), in_tree(_,X,C).

:- in_tree(X,Y,_), in_tree(Z,Y,_), X != Z.

reached(X):- root(X).
reached(Y):- in_tree(X,Y,C).
:-node(X), not reached(X).

:~ in_tree(X,Y,C). [C:1]
