import os

import sys



import numpy as np





def solve(inp):

    def dfs(links, s, checked, postorder):

        stack = [0, s]

        while stack:

            i, v = stack[-2:]

            if i == 0 and checked[v]:

                stack.pop()

                stack.pop()

                continue

            checked[v] = 1

            if i == len(links[v]):

                postorder.append(v)

                stack.pop()

                stack.pop()

                continue

            stack[-2] += 1

            stack.append(0)

            stack.append(links[v][i])



    def dfs2(rev_links, s, checked):

        q = [s]

        checked[s] = 1

        scc = [s]

        while q:

            v = q.pop()

            for u in rev_links[v]:

                if checked[u] == 0:

                    q.append(u)

                    checked[u] = 1

                    scc.append(u)

        return scc



    n = inp[0]

    m = inp[1]

    aaa = inp[2::2]

    bbb = inp[3::2]



    int_list = [0]

    int_list.clear()

    links = [int_list.copy() for _ in range(n)]

    rev_links = [int_list.copy() for _ in range(n)]



    for i in range(m):

        a = aaa[i]

        b = bbb[i]

        if a != b:

            links[a].append(b)

            rev_links[b].append(a)

    links = [list(set(link)) for link in links]

    rev_links = [list(set(link)) for link in rev_links]



    checked = np.zeros(n, np.int8)

    postorder = []



    for v in range(n):

        if checked[v]:

            continue

        dfs(links, v, checked, postorder)



    postorder.reverse()

    checked = np.zeros(n, np.int8)

    sccs = []



    for v in postorder:

        if checked[v]:

            continue

        sccs.append(dfs2(rev_links, v, checked))



    return sccs





if sys.argv[-1] == 'ONLINE_JUDGE':

    from numba.pycc import CC



    cc = CC('my_module')

    cc.export('solve', '(i8[:],)')(solve)

    cc.compile()

    exit()



if os.name == 'posix':

    # noinspection PyUnresolvedReferences

    from my_module import solve

else:

    from numba import njit



    solve = njit('(i8[:],)', cache=True)(solve)

    print('compiled', file=sys.stderr)



inp = np.fromstring(sys.stdin.read(), dtype=np.int64, sep=' ')

ans = solve(inp)

print(len(ans))

for scc in ans:

    print(len(scc), *scc)

import os

import sys



import numpy as np





def solve(inp):

    def dfs(links, s, checked, postorder):

        stack = [0, s]

        while stack:

            i, v = stack[-2:]

            if i == 0 and checked[v]:

                stack.pop()

                stack.pop()

                continue

            checked[v] = 1

            if i == len(links[v]):

                postorder.append(v)

                stack.pop()

                stack.pop()

                continue

            stack[-2] += 1

            stack.append(0)

            stack.append(links[v][i])



    def dfs2(rev_links, s, checked):

        q = [s]

        checked[s] = 1

        scc = [s]

        while q:

            v = q.pop()

            for u in rev_links[v]:

                if checked[u] == 0:

                    q.append(u)

                    checked[u] = 1

                    scc.append(u)

        return scc



    n = inp[0]

    m = inp[1]

    aaa = inp[2::2]

    bbb = inp[3::2]



    int_list = [0]

    int_list.clear()

    links = [int_list.copy() for _ in range(n)]

    rev_links = [int_list.copy() for _ in range(n)]



    for i in range(m):

        a = aaa[i]

        b = bbb[i]

        if a != b:

            links[a].append(b)

            rev_links[b].append(a)



    checked = np.zeros(n, np.int8)

    postorder = []



    for v in range(n):

        if checked[v]:

            continue

        dfs(links, v, checked, postorder)



    postorder.reverse()

    checked = np.zeros(n, np.int8)

    sccs = []



    for v in postorder:

        if checked[v]:

            continue

        sccs.append(dfs2(rev_links, v, checked))



    return sccs





if sys.argv[-1] == 'ONLINE_JUDGE':

    from numba.pycc import CC



    cc = CC('my_module')

    cc.export('solve', '(i8[:],)')(solve)

    cc.compile()

    exit()



if os.name == 'posix':

    # noinspection PyUnresolvedReferences

    from my_module import solve

else:

    from numba import njit



    solve = njit('(i8[:],)', cache=True)(solve)

    print('compiled', file=sys.stderr)



inp = np.fromstring(sys.stdin.read(), dtype=np.int64, sep=' ')

ans = solve(inp)

print(len(ans))

for scc in ans:

    print(len(scc), *scc)

import os
import sys
import numpy as np


def solve(inp):
    def dfs(links, s, checked, postorder):
        stack = [0, s]
        while stack:
            i, v = stack[-2:]
            if i == 0 and checked[v]:
                stack.pop()
                stack.pop()
                continue
            checked[v] = 1
            if i == len(links[v]):
                postorder.append(v)
                stack.pop()
                stack.pop()
                continue
            stack[-2] += 1
            stack.append(0)
            stack.append(links[v][i])

    def dfs2(rev_links, s, checked):
        q = [s]
        checked[s] = 1
        scc = [s]
        while q:
            v = q.pop()
            for u in rev_links[v]:
                if checked[u] == 0:
                    q.append(u)
                    checked[u] = 1
                    scc.append(u)
        return scc

    n = inp[0]
    m = inp[1]
    aaa = inp[2::2]
    bbb = inp[3::2]
    int_list = [0]
    int_list.clear()
    links = [int_list.copy() for _ in range(n)]
    rev_links = [int_list.copy() for _ in range(n)]
    for i in range(m):
        a = aaa[i]
        b = bbb[i]
        if a != b:
            links[a].append(b)
            rev_links[b].append(a)
    links = [list(set(link)) for link in links]
    rev_links = [list(set(link)) for link in rev_links]
    checked = np.zeros(n, np.int8)
    postorder = []
    for v in range(n):
        if checked[v]:
            continue
        dfs(links, v, checked, postorder)
    postorder.reverse()
    checked = np.zeros(n, np.int8)
    sccs = []
    for v in postorder:
        if checked[v]:
            continue
        sccs.append(dfs2(rev_links, v, checked))
    return sccs


if sys.argv[-1] == "ONLINE_JUDGE":
    from numba.pycc import CC

    cc = CC("my_module")
    cc.export("solve", "(i8[:],)")(solve)
    cc.compile()
    exit()
if os.name == "posix":
    # noinspection PyUnresolvedReferences
    from my_module import solve
else:
    from numba import njit

    solve = njit("(i8[:],)", cache=True)(solve)
    print("compiled", file=sys.stderr)
inp = np.fromstring(sys.stdin.read(), dtype=np.int64, sep=" ")
ans = solve(inp)
print(len(ans))
for scc in ans:
    print(len(scc), *scc)

import os
import sys
import numpy as np


def solve(inp):
    def dfs(links, s, checked, postorder):
        stack = [0, s]
        while stack:
            i, v = stack[-2:]
            if i == 0 and checked[v]:
                stack.pop()
                stack.pop()
                continue
            checked[v] = 1
            if i == len(links[v]):
                postorder.append(v)
                stack.pop()
                stack.pop()
                continue
            stack[-2] += 1
            stack.append(0)
            stack.append(links[v][i])

    def dfs2(rev_links, s, checked):
        q = [s]
        checked[s] = 1
        scc = [s]
        while q:
            v = q.pop()
            for u in rev_links[v]:
                if checked[u] == 0:
                    q.append(u)
                    checked[u] = 1
                    scc.append(u)
        return scc

    n = inp[0]
    m = inp[1]
    aaa = inp[2::2]
    bbb = inp[3::2]
    int_list = [0]
    int_list.clear()
    links = [int_list.copy() for _ in range(n)]
    rev_links = [int_list.copy() for _ in range(n)]
    for i in range(m):
        a = aaa[i]
        b = bbb[i]
        if a != b:
            links[a].append(b)
            rev_links[b].append(a)
    checked = np.zeros(n, np.int8)
    postorder = []
    for v in range(n):
        if checked[v]:
            continue
        dfs(links, v, checked, postorder)
    postorder.reverse()
    checked = np.zeros(n, np.int8)
    sccs = []
    for v in postorder:
        if checked[v]:
            continue
        sccs.append(dfs2(rev_links, v, checked))
    return sccs


if sys.argv[-1] == "ONLINE_JUDGE":
    from numba.pycc import CC

    cc = CC("my_module")
    cc.export("solve", "(i8[:],)")(solve)
    cc.compile()
    exit()
if os.name == "posix":
    # noinspection PyUnresolvedReferences
    from my_module import solve
else:
    from numba import njit

    solve = njit("(i8[:],)", cache=True)(solve)
    print("compiled", file=sys.stderr)
inp = np.fromstring(sys.stdin.read(), dtype=np.int64, sep=" ")
ans = solve(inp)
print(len(ans))
for scc in ans:
    print(len(scc), *scc)

-    links = [list(set(link)) for link in links] -    rev_links = [list(set(link)) for link in rev_links]