    class Solution {
//        List<List<Integer>> result = new ArrayList<>();
//
//        public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
//            path(graph, 0, new ArrayList<>());
//            return result;
//        }
//
//        public void path(int[][] graph, int index, List<Integer> list) {
//            list.add(index);
//            if (index == graph.length) {
//                result.add(new ArrayList<>(list));
//                list.remove(list.size() - 1);
//                return;
//            }
//            for (int i = 0; i < graph[index].length; i++) {
//                path(graph, graph[index][i], list);
//            }
//            list.remove(list.size() - 1);
//        }
public List<List<Integer>> allPathsSourceTarget(int[][] graph) {
    return solve(graph, 0);
}

        public List<List<Integer>> solve(int[][] graph, int node) {
            int N = graph.length;
            List<List<Integer>> ans = new ArrayList();
            if (node == N - 1) {
                List<Integer> path = new ArrayList();
                path.add(N-1);
                ans.add(path);
                return ans;
            }

            for (int nei: graph[node]) {
                for (List<Integer> path: solve(graph, nei)) {
                    path.add(0, node);
                    ans.add(path);
                }
            }
            return ans;
        }
    }

//runtime:4 ms
//memory:40.4 MB
