def nextValue(k):
    while True:
        x[k] = (x[k] + 1) % (n + 1)

        if x[k] == 0:
            return

        if G[x[k - 1]][x[k]] == 1:
            for j in range(1, k):
                if x[j] == x[k]:
                    break

            if j == k - 1:
                if k < n or (k == n and G[x[n]][x[1]] == 1):
                    return


def Hamiltonian(k):
    while True:
        nextValue(k)

        if x[k] == 0:
            return

        if k == n:
            print(x[1:n + 1])
        else:
            Hamiltonian(k + 1)


# Example
n = 5

G = [
    [0, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 0, 1],
    [0, 1, 0, 1, 1, 0],
    [0, 1, 1, 0, 1, 1],
    [0, 0, 1, 1, 0, 1],
    [0, 1, 0, 1, 1, 0]
]

x = [0] * (n + 1)
x[1] = 1

Hamiltonian(2)