def dfs_reachable(adj, start, target):
    stack, seen = [start], {start}
    while stack:
        u = stack.pop()
        if u == target:
            return True
        for v in adj[u]:
            if v not in seen:
                seen.add(v)
                stack.append(v)
    return False
