let rearrange_treeCut tree gr edge_id cycle=
    match gr with
      Right a -> (tree,[])
    | Left graph -> 
        let edge = findedge edge_id tree
        in let _ = report2 "kustutasin serva"
        in let (c,t,p) = edge.edge
        in let target_gnode = DG.findnode t graph
        in let target_node = findnode t tree
        in let source_gnode = DG.findnode c.sourceid graph
        in let source_node = findnode c.sourceid tree
        in let tr1 = {tree with treeNodes=
                  IdtMap.add c.sourceid {source_node with node = source_gnode; children = (List.filter (fun x -> x!=t) source_node.children)} 
                    (IdtMap.remove c.sourceid tree.treeNodes)}
        in let tr = {tr1 with treeNodes=IdtMap.add t {target_node with node = target_gnode} (IdtMap.remove t tr1.treeNodes); 
                     treeEdges = IdtMap.remove c.nameforudg tr1.treeEdges}
        in let gr_node_inp = (DG.nodefoldedges (fun y a -> y::a) target_gnode [])
        in let new_inp = List.filter (fun (co,_,_) -> not (hasnode co.sourceid tr)) gr_node_inp
        in let (nc,nt,np) = List.hd new_inp
        in let error_node = DG.findnode nc.sourceid graph
        in let tree2 = ({treeEdges = IdtMap.add nc.nameforudg {edge=(nc,nt.id,np); edgeway = Cross; used = true} tr.treeEdges; 
                    treeNodes = IdtMap.add nc.sourceid {node = error_node; number = NodeNumber.get (); allDone = true; children = [t]} tr.treeNodes; 
                    starting_places = List.concat [tr.starting_places;[nc.sourceid]]})
        in (tree2,[])