#include <bits/stdc++.h>
using namespace std;
vector<int> countReverseEdges(int g_nodes, vector<int> g_from, vector<int> g_to) {
int n = g_nodes;
vector<vector<int>> adj(n);
set<pair<int, int>> dir_edges;
for (int i = 0; i < g_from.size(); ++i) {
int u = g_from[i] - 1;
int v = g_to[i] - 1;
adj[u].push_back(v);
adj[v].push_back(u);
dir_edges.insert({u, v});
}
vector<int> ans(n, 0);
int cost_root_0 = 0;
function<void(int, int)> dfs1 = [&](int u, int p) {
for (int v : adj[u]) {
if (v == p) continue;
if (dir_edges.count({v, u})) {
cost_root_0++;
}
dfs1(v, u);
}
};
dfs1(0, -1);
ans[0] = cost_root_0;
function<void(int, int)> dfs2 = [&](int u, int p) {
for (int v : adj[u]) {
if (v == p) continue;
if (dir_edges.count({u, v})) {
ans[v] = ans[u] + 1;
} else {
ans[v] = ans[u] - 1;
}
dfs2(v, u);
}
};
dfs2(0, -1);
return ans;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
vector<int> from(m), to(m);
for (int i = 0; i < m; ++i) {
cin >> from[i] >> to[i];
}
vector<int> result = countReverseEdges(n, from, to);
for (int x : result)
cout << x << " ";
cout << "\n";
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp2ZWN0b3I8aW50PiBjb3VudFJldmVyc2VFZGdlcyhpbnQgZ19ub2RlcywgdmVjdG9yPGludD4gZ19mcm9tLCB2ZWN0b3I8aW50PiBnX3RvKSB7CiAgICBpbnQgbiA9IGdfbm9kZXM7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGFkaihuKTsKICAgIHNldDxwYWlyPGludCwgaW50Pj4gZGlyX2VkZ2VzOwoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ19mcm9tLnNpemUoKTsgKytpKSB7CiAgICAgICAgaW50IHUgPSBnX2Zyb21baV0gLSAxOwogICAgICAgIGludCB2ID0gZ190b1tpXSAtIDE7CiAgICAgICAgYWRqW3VdLnB1c2hfYmFjayh2KTsKICAgICAgICBhZGpbdl0ucHVzaF9iYWNrKHUpOwogICAgICAgIGRpcl9lZGdlcy5pbnNlcnQoe3UsIHZ9KTsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiBhbnMobiwgMCk7CiAgICBpbnQgY29zdF9yb290XzAgPSAwOwoKICAgIGZ1bmN0aW9uPHZvaWQoaW50LCBpbnQpPiBkZnMxID0gWyZdKGludCB1LCBpbnQgcCkgewogICAgICAgIGZvciAoaW50IHYgOiBhZGpbdV0pIHsKICAgICAgICAgICAgaWYgKHYgPT0gcCkgY29udGludWU7CiAgICAgICAgICAgIGlmIChkaXJfZWRnZXMuY291bnQoe3YsIHV9KSkgewogICAgICAgICAgICAgICAgY29zdF9yb290XzArKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZnMxKHYsIHUpOwogICAgICAgIH0KICAgIH07CgogICAgZGZzMSgwLCAtMSk7CiAgICBhbnNbMF0gPSBjb3N0X3Jvb3RfMDsKCiAgICBmdW5jdGlvbjx2b2lkKGludCwgaW50KT4gZGZzMiA9IFsmXShpbnQgdSwgaW50IHApIHsKICAgICAgICBmb3IgKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgICAgIGlmICh2ID09IHApIGNvbnRpbnVlOwogICAgICAgICAgICBpZiAoZGlyX2VkZ2VzLmNvdW50KHt1LCB2fSkpIHsKICAgICAgICAgICAgICAgIGFuc1t2XSA9IGFuc1t1XSArIDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhbnNbdl0gPSBhbnNbdV0gLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRmczIodiwgdSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZnMyKDAsIC0xKTsKCiAgICByZXR1cm4gYW5zOwp9CgppbnQgbWFpbigpIHsKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CgogICAgaW50IG4sIG07CiAgICBjaW4gPj4gbiA+PiBtOwogICAgdmVjdG9yPGludD4gZnJvbShtKSwgdG8obSk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewogICAgICAgIGNpbiA+PiBmcm9tW2ldID4+IHRvW2ldOwogICAgfQoKICAgIHZlY3RvcjxpbnQ+IHJlc3VsdCA9IGNvdW50UmV2ZXJzZUVkZ2VzKG4sIGZyb20sIHRvKTsKCiAgICBmb3IgKGludCB4IDogcmVzdWx0KQogICAgICAgIGNvdXQgPDwgeCA8PCAiICI7CiAgICBjb3V0IDw8ICJcbiI7CgogICAgcmV0dXJuIDA7Cn0K