diff --git a/src/steiner_tree.rs b/src/steiner_tree.rs
index 091d764..f3fa931 100644
--- a/src/steiner_tree.rs
+++ b/src/steiner_tree.rs
@@ -1,14 +1,9 @@
 use {
-    std::collections::HashMap,
     crate::{
-        TypeID,
-        TypeTerm,
         morphism::{
-            MorphismType,
-            Morphism,
-            MorphismBase
-        }
-    }
+            Morphism, MorphismBase, MorphismType
+        }, MorphismInstance, TypeID, TypeTerm
+    }, std::collections::HashMap
 };
 
 //<<<<>>>><<>><><<>><<<*>>><<>><><<>><<<<>>>>\\
@@ -91,10 +86,11 @@ impl PathApproxSteinerTreeSolver {
         }
     }
 
-    pub fn solve<M: Morphism + Clone>(self, morphisms: &MorphismBase<M>) -> Option< SteinerTree > {
-        let mut tree = Vec::<MorphismType>::new();
+    pub fn solve<M: Morphism + Clone + PartialEq>(self, morphisms: &MorphismBase<M>) -> Option< SteinerTree > {
+        let mut edges = Vec::<MorphismType>::new();
 
         for goal in self.leaves {
+            eprintln!("solve steiner tree: find path to goal {:?}", goal);
             // try to find shortest path from root to current leaf
             if let Some(new_path) = morphisms.find_morphism_path(
                 MorphismType {
@@ -102,6 +98,15 @@ impl PathApproxSteinerTreeSolver {
                     dst_type: goal.clone()
                 }
             ) {
+                eprintln!("path to {:?} has len {}", goal.clone(), new_path.len());
+                for morph_inst in new_path {
+                    let t = morph_inst.get_type();
+                    if ! edges.contains(&t) {
+                        eprintln!("add edge {:?}", t);
+                        edges.push(t);
+                    }
+                }
+/*
                 // reduce new path so that it does not collide with any existing path
                 let mut src_type = self.root.clone();
                 let mut new_path_iter = new_path.into_iter().peekable();
@@ -109,12 +114,14 @@ impl PathApproxSteinerTreeSolver {
                 // check all existing nodes..
 
                 if new_path_iter.peek().unwrap().get_type().src_type == src_type {
+                    eprintln!("skip initial node..");
                     new_path_iter.next();
                 }
 
                 for mt in tree.iter() {
                     //assert!( mt.src_type == &src_type );
                     if let Some(t) = new_path_iter.peek() {
+                        eprintln!("");
                         if &mt.dst_type == &t.get_type().src_type {
                             // eliminate this node from new path
                             src_type = new_path_iter.next().unwrap().get_type().src_type;
@@ -127,6 +134,7 @@ impl PathApproxSteinerTreeSolver {
                 for m in new_path_iter {
                     tree.push(m.get_type());
                 }
+*/
             } else {
                 eprintln!("could not find path\nfrom {:?}\nto {:?}", &self.root, &goal);
                 return None;
@@ -136,7 +144,7 @@ impl PathApproxSteinerTreeSolver {
         Some(SteinerTree {
             weight: 0,
             goals: vec![],
-            edges: tree
+            edges
         })
     }
 }