from collections import deque

def safe_nodes(adj):
    reverse = [[] for _ in adj]
    remaining = [len(neighbors) for neighbors in adj]
    for u, neighbors in enumerate(adj):
        for v in neighbors:
            reverse[v].append(u)
    queue = deque(u for u, degree in enumerate(remaining) if degree == 0)
    safe = [False] * len(adj)
    while queue:
        v = queue.popleft()
        safe[v] = True
        for u in reverse[v]:
            remaining[u] -= 1
            if remaining[u] == 0:
                queue.append(u)
    return [u for u in range(len(adj)) if safe[u]]
