def dfs_recursive(self, start=0):
    """
    Recursive depth first traversal starting from vertex `start`.
    """
    visited = [False] * self.n
    order = [start]
    visited[start] = True

    def dfs_util(v):
        for i in self.adj_list[v]:
            if not visited[i]:
                order.append(i)
                visited[i] = True
                dfs_util(i)
    
    dfs_util(start)
    return order