Adapting this answer for finding the transitive closure of a symmetric binary relation (and dropping the symmetry property):
edges = {1 -> 3, 1 -> 4, 2 -> 4, 2 -> 5, 3 -> 5, 6 -> 7, 7 -> 8,
8 -> 9, 9 -> 10, 6 -> 10, 1 -> 6, 2 -> 7, 3 -> 8, 4 -> 9, 5 -> 10};
pairs = edges /. Rule -> List;
m = Max@pairs;
(*the adjacency matrix of atomic elements in pairs:*)
SparseArray[pairs~Append~{i_, i_} -> 1, {m, m}];
(* find the transitive closure:*)
Normal@Sign@MatrixPower[N@%, m];
(* find labels of reachable vertices *)
Join @@ Position[#, 1] & /@ %
(*==> {{1, 3, 4, 5, 6, 7, 8, 9, 10}, {2, 4, 5, 7, 8, 9, 10},
{3, 5, 8, 9, 10}, {4, 9, 10}, {5, 10}, {6, 7, 8, 9, 10},
{7, 8, 9, 10}, {8, 9, 10}, {9, 10}, {10}} *)
(* organize: *)
Grid[{First@#, Rest@#} & /@ %, Alignment -> Left]

Note: As is, this works for cases where the vertex list is a range of contigous integers. For a general graph g where vertex list is an arbitrary set, one can work with the set of vertex indices VertexIndex[g,#]&/@VertexList[g].