#include <iostream>
#include <queue>
#include <vector>
std::vector<int> bfs(const std::vector<std::vector<std::size_t>>& graph, std::size_t start) {
    std::vector<int> distance(graph.size(), -1);
    distance.at(start) = 0;
    std::queue<std::size_t> pending;
    pending.push(start);
    while (!pending.empty()) {
        const auto v = pending.front(); pending.pop();
        for (const auto next : graph.at(v)) {
            if (distance.at(next) != -1) continue;
            distance[next] = distance[v] + 1;
            pending.push(next);
        }
    }
    return distance;
}
int main() {
    const std::vector<std::vector<std::size_t>> graph{{1,2},{0,3},{0,3},{1,2},{}};
    const auto d = bfs(graph, 0);
    if (d != std::vector<int>{0,1,1,2,-1}) return 1;
    for (std::size_t i = 0; i < d.size(); ++i) std::cout << (i == 0 ? "" : " ") << d[i];
    std::cout << '\n';
}
