e hash sets for in & out edges.
Note: I believe using lazy deletion we can further optimize RemoveVertex operation to O(1) amortized even though I haven't tested that idea. For example upon deletion just mark the vertex as deleted in dictionary, and then lazily clear orphaned edges during other operations.