content: class Solution {
      public boolean dfs(int node, int[][] adj, boolean[] visit, boolean[] inStack) {
          // If the node is already in the stack, we have a cycle.
          if (inStack[node]) {
              return true;
          }
          if (visit[node]) {
              return false;
          }
          // Mark the current node as visited and part of current recursion stack.
          visit[node] = true;
          inStack[node] = true;
          for (int neighbor : adj[node]) {
              if (dfs(neighbor, adj, visit, inStack)) {
                  return true;
              }
          }
          // Remove the node from the stack.
          inStack[node] = false;
          return false;
      }
  
      public List<Integer> eventualSafeNodes(int[][] graph) {
          int n = graph.length;
          boolean[] visit = new boolean[n];
          boolean[] inStack = new boolean[n];
  
          for (int i = 0; i < n; i++) {
              dfs(i, graph, visit, inStack);
          }
  
          List<Integer> safeNodes = new ArrayList<>();
          for (int i = 0; i < n; i++) {
              if (!inStack[i]) {
                  safeNodes.add(i);
              }
          }
  
          return safeNodes;
      }
  }