m = {1: 2, 7: 3, 2: 1, 4: 4, 5: 3, 6: 9}
n = {1:2, 2:3, 3:4, 4:5, 5:1, 6:1, 7:1, 8:8}

cycles = set()
for k, v in m.items():
    if m.get(v) == k:
        cycles.add(tuple(sorted((k, v))))

output = [[k] if k == v else (k, v) for k, v in cycles]
print(output)

cycles = set(tuple(sorted(item)) for item in m.items() if m.get(item[1]) == item[0])


output = [[k] if k == v else (k, v) for k, v in cycles]
print(output)

def find_cycles(m):
    n = m.copy()  # don't mutilate the original
    cycles = []
    while n:
        visited = {}
        count = 0
        k, v = n.popitem()
        while v is not None:
            visited[k] = (count, v)
            count += 1
            k = v
            v = n.pop(k, None)

        if k in visited:
            cycle_start = visited[k][0]
            item = min((k, v) for k, (c, v) in visited.items() if c >= cycle_start)
            cycles.append(item)

    return [[k] if k == v else (k, v) for k, v in cycles]

print(find_cycles(m))
print(find_cycles(n))

def find_cycles(m):
    n = m.copy()  # don't mutilate the original
    cycles = []
    while n:
        visited = {}
        count = 0
        k, v = n.popitem()
        while v is not None:
            visited[k] = count
            count += 1
            k = v
            v = n.pop(k, None)

        if k in visited:
            if len(visited) == 1:
                cycle = list(visited.keys())
            else:
                cycle_start = visited[k]
                cycle = sorted((c, k) for k, c in visited.items() if c >= cycle_start)
                cycle = tuple(k for c, k in cycle)
                k = min(range(len(cycle)), key=lambda x: cycle[x])
                cycle = cycle[k:] + cycle[:k]
            cycles.append(cycle)

    return cycles

print(find_cycles(m))
print(find_cycles(n))