def directed_cycle(adj):
    state = [0] * len(adj)
    def visit(u):
        state[u] = 1
        for v in adj[u]:
            if state[v] == 1:
                return True
            if state[v] == 0 and visit(v):
                return True
        state[u] = 2
        return False
    return any(state[u] == 0 and visit(u) for u in range(len(adj)))
