def strongly_connected_components(graph: Graph) -> List:
assert check_argument_types()<EOL>result = []<EOL>stack = []<EOL>low = {}<EOL>def visit(node: str):<EOL><INDENT>if node in low: return<EOL>num = len(low)<EOL>low[node] = num<EOL>stack_pos = len(stack)<EOL>stack.append(node)<EOL>for successor in graph[node]:<EOL><INDENT>visit(successor)<EOL>low[node] = min(low[node], low[successor])<EOL><DEDENT>if num == low[node]:<EOL><INDENT>component = tuple(stack[stack_pos:])<EOL>del stack[stack_pos:]<EOL>result.append(component)<EOL>for item in component:<EOL><INDENT>low[item] = len(graph)<EOL><DEDENT><DEDENT><DEDENT>for node in graph:<EOL><INDENT>visit(node)<EOL><DEDENT>return result<EOL>
Find the strongly connected components in a graph using Tarjan's algorithm.

    The `graph` argument should be a dictionary mapping node names to sequences of successor nodes.