int make_tree_bfs(int u, vvi &backedge, vvi &adj, vvi &tree)
{
    vi par(n, -1);
    queue<int> q;
    vector<int> frontier;
    vector<int> next_frontier;
    frontier.push_back(u);
    vis[u] = 1;
    // q.push(u);
    int n = 1;
    while (!frontier.empty())
    {
        for (int i = 0; i < frontier.size(); i++)
        {
            int cur = frontier[i];
            for (auto v : adj[cur])
            {
                if (!vis[v])
                {
                    vis[v] = 1;
                    par[v] = cur;
                    tree[cur].push_back(v); // only par->child edges
                    next_frontier.push_back(v);
                    n++;
                }
                else if (par[cur] != v)
                {
                    backedge[cur].push_back(v);
                }
            }
        }
        frontier = next_frontier;
        next_frontier.clear();
    }
    return n;
}