First, we propose a compression scheme for Web graphs that reduces edges by representing dense subgraphs with "virtual nodes"; over this scheme we apply node orderings and other compression techniques. With this approach we match the best current compression ratios that support out-neighbor queries (i.e., nodes pointed from a given node), using 1.0-1.8 bits per edge (bpe) on large Web graphs, and retrieving each neighbor of a node in 0.6-1.0 microseconds. When supporting both out- and in-neighbor queries, instead, our technique generally offers the best time when using little space. If the reduced graph, instead, is represented with a compact data structure that supports bidirectional navigation, we obtain the most compact Web graph representations (0.9-1.5 bpe) that support out/in-neighbor navigation, yet the time per neighbor extracted raises to around 5-20 microseconds. We also propose a compact data structure that represents dense subgraphs without using virtual nodes. It allows us to recover out/in-neighbors and answer other more complex queries on the dense subgraphs identified. This structure is not competitive on Web graphs, but on social networks it achieves 4-13 bpe and 8-12 microseconds per out/in-neighbor retrieved, which improves upon all existing representations.