A new algorithm is proposed for finding the blocks (biconnected components) of an undirected graph. A serial implementation runs in O(nm) time and space on a graph of n vertices and m edges. A parallel implementation runs in O(log n) time and O(nm) space using O(nm) processors on a concurrent-read, concurrent-write parallel RAM. An alternative implementation runs in O(n**2 /p) time and O(n**2 ) space using any number p less than equivalent to n**2 /log**2 n of processors, on a concurrent-read, exclusive-write parallel RAM. The latter algorithm has optimal speed-up, assuming an adjacency matrix representation of the input.