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;
}