#!/usr/bin/env python3
from random import choice, choices, randint, sample, seed, shuffle
import sys


P = int(sys.argv[1])
ISPOS = int(sys.argv[2])
MX = 100000
seed(int(sys.argv[3]))
ISTRANSPOSE = int(sys.argv[4])


# on one side all the points, on the other side all the lines
perxy = [[] for i in range(P*P)]
cnt=0
if ISPOS:
    MX-=2
def gen():
    global cnt

    at=1

    for a in range(P):
        for b in range(P):
            for x in range(P):
                cnt+=1
                perxy[x + P*((a*x+b)%P)].append(at)
                if cnt==MX:
                    return
            at+=1

    # vertical lines!

    x = b
    for b in range(P):
        for y in range(P):
            cnt+=1
            perxy[b+P*y].append(at)
            if cnt==MX:
                return
        at+=1
gen()
hi,hj = [[0,P*P-1], [0,1],[P*P-2,P*P-1]][int(sys.argv[5])]

shuffle(perxy)

if ISPOS:
    xy = [MX,MX+1]
    for i in [hi,hj]:
        gone = min(2,len(perxy[i]))
        tolose = set(sample(perxy[i],gone))

        perxy[i] = list(sorted( (set(perxy[i]) | set(xy)) - tolose ) )



lab = set() 
while len(lab)<MX+100:
    lab.add(randint(1,10**9))
lab = sorted(lab)
shuffle(lab)

if ISTRANSPOSE:
    adj = []
    for i,l in enumerate(perxy):
        for j in l:
            while len(adj)<=j:
                adj.append([])
            adj[j].append(i)
    perxy=adj
    perxy = [l for l in perxy if len(l)>1]
print(len(perxy))
for es in perxy:
    es = [lab[i] for i in es]
    shuffle(es)
    print(len(es),*es)
