diff --git a/Graph/main_3.py b/Graph/main_3.py
index 4ad78ba7e258bc81433579422ad0f03ec378a48b..cd985e5a4f3279c3f6dc3c2c6570941388ea8331 100644
--- a/Graph/main_3.py
+++ b/Graph/main_3.py
@@ -1,62 +1,91 @@
-from graph.graph_2 import NDGraph, NDWGraph, Node, BFS, DFS
+from graph.graph_3 import UnDirectedGraph, DirectedGraph, Node, Edge
+from graph.traversing import BFS, DFS
 
+
+print("=============== UnDirected weight Graph =============")
 # We want to create a toy graph (not directed) to check our algos
 #              no
 #             /  \
 #            n1  n3
-#            |    |
+#            |  / |
 #            n2  n4
 #             \  /
 #              n5
 
 
 nodes = [Node() for _ in range(6)]
-g = NDGraph(nodes)
+g = UnDirectedGraph()
+
+g.add_edge(nodes[0], nodes[1], weight=1)
+g.add_edge(nodes[0], nodes[3], weight=3)
+g.add_edge(nodes[1], nodes[2], weight=2)
+g.add_edge(nodes[2], nodes[5], weight=5)
+g.add_edge(nodes[3], nodes[4], weight=4)
+g.add_edge(nodes[4], nodes[5], weight=6)
+g.add_edge(nodes[3], nodes[2], weight=15)
+print("BFS")
+for n, p in BFS(g, nodes[0]):
+    print(n, [str(e) for e in p])
+print(f"distance = {sum([e.weight for e in p])}")
 
-g.add_edge(nodes[0], (nodes[1], nodes[3]))
-g.add_edge(nodes[1], (nodes[2],))
-g.add_edge(nodes[2], (nodes[5],))
-g.add_edge(nodes[3], (nodes[4],))
-g.add_edge(nodes[4], (nodes[5],))
+#              no
+#             /  \
+#            n1  n3
+#            | X  |
+#            n2  n4
+#             \  /
+#              n5
 
+g.add_edge(nodes[1], nodes[4], weight=20)
 
-# The graph is created we will test
+print("Order", g.order())
+print("Size", g.size())
 
-# a Depth First Search
-# starting from n0
-# the possible solutions are
-# n0, n1,n2,n5,n4,n3
-# n0, n3, n4, n5, n2, n1
+print("BFS")
+for n, p in BFS(g, nodes[0]):
+    print(n, [str(e) for e in p])
+print(f"distance = {sum([e.weight for e in p])}")
 
 print("DFS")
-for n in DFS(g, nodes[0]):
-    print(n.id)
+for n, p in DFS(g, nodes[0]):
+    print(n, [str(e) for e in p])
+print(f"distance = {sum([e.weight for e in p])}")
 
-# a Breadth First Search
-# starting n0
-# the possible solutions are
-# n0, n1, n3, n2, n4, n5
-# n0, n3, n1, n2, n4, n5
-# n0, n1, n3, n4, n2, n5
-# ....
-
-print("BFS")
-for n, _ in BFS(g, nodes[0]):
-    print(n.id)
+print("=============== Directed weighted Graph =============")
+nodes += [Node() for _ in range(6)]
+g = DirectedGraph()
 
+g.add_edge(nodes[6], nodes[7], weight=1)
+g.add_edge(nodes[7], nodes[8], weight=2)
+g.add_edge(nodes[8], nodes[11], weight=5)
+g.add_edge(nodes[11], nodes[10], weight=4)
+g.add_edge(nodes[6], nodes[9], weight=6)
+g.add_edge(nodes[9], nodes[10], weight=7)
+g.add_edge(nodes[8], nodes[9], weight=8)
+g.add_edge(nodes[7], nodes[10], weight=9)
+g.add_edge(nodes[10], nodes[7], weight=10)
 
-nodes = [Node() for _ in range(6)]
-g = NDWGraph(nodes)
+#              n6
+#             /  \
+#            v    V
+#            n7  n9
+#            |^  ^|
+#            | X  |
+#            v   vv
+#            n8  n10
+#             \  ^
+#              v/
+#              n11
 
-g.add_edge(nodes[0], nodes[1], 1)
-g.add_edge(nodes[0], nodes[3], 3)
-g.add_edge(nodes[1], nodes[2], 2)
-g.add_edge(nodes[2], nodes[5], 5)
-g.add_edge(nodes[3], nodes[4], 4)
-g.add_edge(nodes[4], nodes[5], 5)
+print("Order", g.order())
+print("Size", g.size())
 
 print("BFS")
-path_len = 0
-for n, w in BFS(g, nodes[0]):
-    path_len += w
-    print(n, w, path_len)
+for n, p in BFS(g, nodes[6]):
+    print(n, [str(e) for e in p])
+print(f"distance = {sum([e.weight for e in p])}")
+
+print("DFS")
+for n, p in DFS(g, nodes[6]):
+    print(n, [str(e) for e in p])
+print(f"distance = {sum([e.weight for e in p])}")