docs: def del_edge(self, e):
          '''
          API: del_edge(self, e)
          Description:
          Removes edge from graph.
          Input:
              e: Tuple that represents edge, in (source,sink) form.
          Pre:
              Graph should contain this edge.
          Post:
              self.edge_attr, self.neighbors and self.in_neighbors are updated.
          '''
          if self.graph_type is DIRECTED_GRAPH:
              try:
                  del self.edge_attr[e]
              except KeyError:
                  raise Exception('Edge %s does not exists!' %str(e))
              self.neighbors[e[0]].remove(e[1])
              self.in_neighbors[e[1]].remove(e[0])
          else:
              try:
                  del self.edge_attr[e]
              except KeyError:
                  try:
                      del self.edge_attr[(e[1],e[0])]
                  except KeyError:
                      raise Exception('Edge %s does not exists!' %str(e))
              self.neighbors[e[0]].remove(e[1])
              self.neighbors[e[1]].remove(e[0])