import sys

input = sys.stdin.readline

n,m = list(map(int, input().split()))

es = [[] for _ in range(n)]

for i in range(m):

    a,b=list(map(int, input().split()))

    es[a].append(b)



# strongly connected component

def scc(es): # DFSを2回行う

    n_node = len(es)

    esinv = [[] for _ in range(n_node)]

    for i in range(n_node):

        for e in es[i]:

            esinv[e].append(i)

    used = [False]*n_node

    dim = [len(es[i]) for i in range(n_node)]

    order = []

    for st in range(n_node): # DFS 1回目, postorderを求める

        if not used[st]:

            stack = [(st, 0)] # [(index, 既に辿ったエッジの数)]

            while stack:

                now, i = stack.pop() 

                if not i and used[now]:

                    continue

                else:

                    used[now] = True

                    if i < dim[now]: # nowから延びるエッジを辿りきってない

                        stack.append((now,i+1))

                        stack.append((es[now][i],0))

                    else: # nowから延びる全てのエッジを辿った

                        order.append(now)

    res = [-1]*n_node # 各ノードが所属するグループのidを保存

    used = [False]*n_node 

    cnt = -1 # idカウンター

    for st in order[::-1]:  # DFS 2回目, postorderの逆順から

        if not used[st]:    # 逆向き矢印を辿って通れるノードを記録していく

            cnt += 1

            stack = [st]

            res[st] = cnt

            used[st] = True

            while stack:

                now = stack.pop()

                for e in esinv[now]:

                    if not used[e]:

                        used[e] = True

                        res[e] = cnt

                        stack.append(e)

    n_group = cnt+1

    components = [[] for _ in range(n_group)]

    for i in range(n_node):

        components[res[i]].append(i)

    return res, components



res,compo= scc(es)

# print(res,compo)



row=max(res)+1



print(row)

for i in range(row):

    length = len(compo[i])

    print((length, *compo[i]))
import sys

input = sys.stdin.readline

n,m = list(map(int, input().split()))

es = [[] for _ in range(n)]

for i in range(m):

    a,b=list(map(int, input().split()))

    es[a].append(b)



# strongly connected component

def scc(n_node,es): # DFSを2回行う

    esinv = [[] for _ in range(n_node)]

    for i in range(n_node):

        for e in es[i]:

            esinv[e].append(i)

    used = [False]*n_node

    dim = [len(es[i]) for i in range(n_node)]

    order = []

    for st in range(n_node): # DFS 1回目, postorderを求める

        if not used[st]:

            stack = [(st, 0)] # [(index, 既に辿ったエッジの数)]

            while stack:

                now, i = stack.pop() 

                if not i and used[now]:

                    continue

                else:

                    used[now] = True

                    if i < dim[now]: # nowから延びるエッジを辿りきってない

                        stack.append((now,i+1))

                        stack.append((es[now][i],0))

                    else: # nowから延びる全てのエッジを辿った

                        order.append(now)

    res = [-1]*n_node # 各ノードが所属するグループのidを保存

    used = [False]*n_node 

    cnt = -1 # idカウンター

    for st in order[::-1]:  # DFS 2回目, postorderの逆順から

        if not used[st]:    # 逆向き矢印を辿って通れるノードを記録していく

            cnt += 1

            stack = [st]

            res[st] = cnt

            used[st] = True

            while stack:

                now = stack.pop()

                for e in esinv[now]:

                    if not used[e]:

                        used[e] = True

                        res[e] = cnt

                        stack.append(e)

    n_group = cnt+1

    components = [[] for _ in range(n_group)]

    for i in range(n_node):

        components[res[i]].append(i)

    return res, components



res,compo=scc(n,es)

# print(res,compo)



row=max(res)+1



print(row)

for i in range(row):

    length = len(compo[i])

    print((length, *compo[i]))

import sys

input = sys.stdin.readline
n, m = list(map(int, input().split()))
es = [[] for _ in range(n)]
for i in range(m):
    a, b = list(map(int, input().split()))
    es[a].append(b)
# strongly connected component
def scc(es):  # DFSを2回行う
    n_node = len(es)
    esinv = [[] for _ in range(n_node)]
    for i in range(n_node):
        for e in es[i]:
            esinv[e].append(i)
    used = [False] * n_node
    dim = [len(es[i]) for i in range(n_node)]
    order = []
    for st in range(n_node):  # DFS 1回目, postorderを求める
        if not used[st]:
            stack = [(st, 0)]  # [(index, 既に辿ったエッジの数)]
            while stack:
                now, i = stack.pop()
                if not i and used[now]:
                    continue
                else:
                    used[now] = True
                    if i < dim[now]:  # nowから延びるエッジを辿りきってない
                        stack.append((now, i + 1))
                        stack.append((es[now][i], 0))
                    else:  # nowから延びる全てのエッジを辿った
                        order.append(now)
    res = [-1] * n_node  # 各ノードが所属するグループのidを保存
    used = [False] * n_node
    cnt = -1  # idカウンター
    for st in order[::-1]:  # DFS 2回目, postorderの逆順から
        if not used[st]:  # 逆向き矢印を辿って通れるノードを記録していく
            cnt += 1
            stack = [st]
            res[st] = cnt
            used[st] = True
            while stack:
                now = stack.pop()
                for e in esinv[now]:
                    if not used[e]:
                        used[e] = True
                        res[e] = cnt
                        stack.append(e)
    n_group = cnt + 1
    components = [[] for _ in range(n_group)]
    for i in range(n_node):
        components[res[i]].append(i)
    return res, components


res, compo = scc(es)
# print(res,compo)
row = max(res) + 1
print(row)
for i in range(row):
    length = len(compo[i])
    print((length, *compo[i]))

import sys

input = sys.stdin.readline
n, m = list(map(int, input().split()))
es = [[] for _ in range(n)]
for i in range(m):
    a, b = list(map(int, input().split()))
    es[a].append(b)
# strongly connected component
def scc(n_node, es):  # DFSを2回行う
    esinv = [[] for _ in range(n_node)]
    for i in range(n_node):
        for e in es[i]:
            esinv[e].append(i)
    used = [False] * n_node
    dim = [len(es[i]) for i in range(n_node)]
    order = []
    for st in range(n_node):  # DFS 1回目, postorderを求める
        if not used[st]:
            stack = [(st, 0)]  # [(index, 既に辿ったエッジの数)]
            while stack:
                now, i = stack.pop()
                if not i and used[now]:
                    continue
                else:
                    used[now] = True
                    if i < dim[now]:  # nowから延びるエッジを辿りきってない
                        stack.append((now, i + 1))
                        stack.append((es[now][i], 0))
                    else:  # nowから延びる全てのエッジを辿った
                        order.append(now)
    res = [-1] * n_node  # 各ノードが所属するグループのidを保存
    used = [False] * n_node
    cnt = -1  # idカウンター
    for st in order[::-1]:  # DFS 2回目, postorderの逆順から
        if not used[st]:  # 逆向き矢印を辿って通れるノードを記録していく
            cnt += 1
            stack = [st]
            res[st] = cnt
            used[st] = True
            while stack:
                now = stack.pop()
                for e in esinv[now]:
                    if not used[e]:
                        used[e] = True
                        res[e] = cnt
                        stack.append(e)
    n_group = cnt + 1
    components = [[] for _ in range(n_group)]
    for i in range(n_node):
        components[res[i]].append(i)
    return res, components


res, compo = scc(n, es)
# print(res,compo)
row = max(res) + 1
print(row)
for i in range(row):
    length = len(compo[i])
    print((length, *compo[i]))

-def scc(es):  # DFSを2回行う -    n_node = len(es) +def scc(n_node, es):  # DFSを2回行う -res, compo = scc(es) +res, compo = scc(n, es)