#include <bits/stdc++.h>
#define SPED \
ios_base::sync_with_stdio(false); \
cin.tie(0); \
cout.tie(0);
#define endl "\n"
#define fi first
#define se second
#define lint long long
#define fami signed
#define lore main
#define freefire freopen
#define Data tuple<lint, int, int>
const lint INF = 0x1f1f1f1f1f1f1f1f;
const lint NEG = 0xE1E1E1E1E1E1E1E1;
using namespace std;
int n, t, m;
lint dist[200005], dp[2][200005]; // hmm có khi dp được tính bằng bfs
vector<int> adj[200005], rev[200005]; // can rev adj k?
void reset()
{
for (int i = 1; i <= n; i++)
{
adj[i].clear();
rev[i].clear();
}
}
void bfs()
{
fill(dist + 1, dist + 1 + n, INF);
dist[1] = 0;
queue<int> temp;
temp.emplace(1);
while (!temp.empty())
{
auto now = temp.front();
temp.pop();
for (auto v : adj[now])
{
if (dist[v] > dist[now] + 1)
{
dist[v] = dist[now] + 1;
temp.emplace(v);
}
}
}
}
void dijkstra()
{
priority_queue<Data, vector<Data>, greater<Data>> pq;
for (int i = 1; i <= n; i++)
{
dp[0][i] = dist[i];
pq.emplace(dist[i], 0, i);
}
fill(dp[1] + 1, dp[1] + 1 + n, INF);
while (!pq.empty())
{
auto [du, cnt, u] = pq.top();
pq.pop();
if (du > dp[cnt][u])
continue;
for (auto v : rev[u]) // cạnh ngược
{
if (dist[v] < dist[u]) // loại 1
{
if (dp[cnt][v] > dp[cnt][u])
{
dp[cnt][v] = dp[cnt][u];
pq.emplace(dp[cnt][v], cnt, v);
}
}
else // loại 2
{
if (cnt == 0)
{
if (dp[cnt + 1][v] > min(dp[cnt][u], dist[v]))
{
dp[cnt + 1][v] = min(dp[cnt][u], dist[v]);
pq.emplace(dp[cnt + 1][v], cnt + 1, v);
}
}
}
}
}
}
fami lore()
{
SPED;
cin >> t;
while (t--)
{
cin >> n >> m;
for (int i = 1; i <= m; i++)
{
int l, r;
cin >> l >> r;
adj[l].emplace_back(r);
rev[r].emplace_back(l);
}
// cout << endl;
bfs();
dijkstra();
// for (int i = 1; i <= n; i++)
// cout << dist[i] << " ";
// cout << endl;
for (int i = 1; i <= n; i++)
cout << min(dp[0][i], dp[1][i]) << " ";
cout << endl;
reset();
}
}
// Let your soul wander where dreams are born.
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIFNQRUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICBjaW4udGllKDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgY291dC50aWUoMCk7CgojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgbGludCBsb25nIGxvbmcKI2RlZmluZSBmYW1pIHNpZ25lZAojZGVmaW5lIGxvcmUgbWFpbgojZGVmaW5lIGZyZWVmaXJlIGZyZW9wZW4KI2RlZmluZSBEYXRhIHR1cGxlPGxpbnQsIGludCwgaW50PgoKY29uc3QgbGludCBJTkYgPSAweDFmMWYxZjFmMWYxZjFmMWY7CmNvbnN0IGxpbnQgTkVHID0gMHhFMUUxRTFFMUUxRTFFMUUxOwoKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmludCBuLCB0LCBtOwpsaW50IGRpc3RbMjAwMDA1XSwgZHBbMl1bMjAwMDA1XTsgICAgIC8vIGhtbSBjw7Mga2hpIGRwIMSRxrDhu6NjIHTDrW5oIGLhurFuZyBiZnMKdmVjdG9yPGludD4gYWRqWzIwMDAwNV0sIHJldlsyMDAwMDVdOyAvLyBjYW4gcmV2IGFkaiBrPwoKdm9pZCByZXNldCgpCnsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBhZGpbaV0uY2xlYXIoKTsKICAgICAgICByZXZbaV0uY2xlYXIoKTsKICAgIH0KfQoKdm9pZCBiZnMoKQp7CiAgICBmaWxsKGRpc3QgKyAxLCBkaXN0ICsgMSArIG4sIElORik7CiAgICBkaXN0WzFdID0gMDsKICAgIHF1ZXVlPGludD4gdGVtcDsKICAgIHRlbXAuZW1wbGFjZSgxKTsKICAgIHdoaWxlICghdGVtcC5lbXB0eSgpKQogICAgewogICAgICAgIGF1dG8gbm93ID0gdGVtcC5mcm9udCgpOwogICAgICAgIHRlbXAucG9wKCk7CgogICAgICAgIGZvciAoYXV0byB2IDogYWRqW25vd10pCiAgICAgICAgewogICAgICAgICAgICBpZiAoZGlzdFt2XSA+IGRpc3Rbbm93XSArIDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGRpc3Rbdl0gPSBkaXN0W25vd10gKyAxOwogICAgICAgICAgICAgICAgdGVtcC5lbXBsYWNlKHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9Cgp2b2lkIGRpamtzdHJhKCkKewogICAgcHJpb3JpdHlfcXVldWU8RGF0YSwgdmVjdG9yPERhdGE+LCBncmVhdGVyPERhdGE+PiBwcTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgIHsKICAgICAgICBkcFswXVtpXSA9IGRpc3RbaV07CiAgICAgICAgcHEuZW1wbGFjZShkaXN0W2ldLCAwLCBpKTsKICAgIH0KCiAgICBmaWxsKGRwWzFdICsgMSwgZHBbMV0gKyAxICsgbiwgSU5GKTsKCiAgICB3aGlsZSAoIXBxLmVtcHR5KCkpCiAgICB7CiAgICAgICAgYXV0byBbZHUsIGNudCwgdV0gPSBwcS50b3AoKTsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpZiAoZHUgPiBkcFtjbnRdW3VdKQogICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgZm9yIChhdXRvIHYgOiByZXZbdV0pIC8vIGPhuqFuaCBuZ8aw4bujYwogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRpc3Rbdl0gPCBkaXN0W3VdKSAvLyBsb+G6oWkgMQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoZHBbY250XVt2XSA+IGRwW2NudF1bdV0pCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHBbY250XVt2XSA9IGRwW2NudF1bdV07CiAgICAgICAgICAgICAgICAgICAgcHEuZW1wbGFjZShkcFtjbnRdW3ZdLCBjbnQsIHYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgLy8gbG/huqFpIDIKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGNudCA9PSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmIChkcFtjbnQgKyAxXVt2XSA+IG1pbihkcFtjbnRdW3VdLCBkaXN0W3ZdKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRwW2NudCArIDFdW3ZdID0gbWluKGRwW2NudF1bdV0sIGRpc3Rbdl0pOwogICAgICAgICAgICAgICAgICAgICAgICBwcS5lbXBsYWNlKGRwW2NudCArIDFdW3ZdLCBjbnQgKyAxLCB2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmZhbWkgbG9yZSgpCnsKICAgIFNQRUQ7CiAgICBjaW4gPj4gdDsKICAgIHdoaWxlICh0LS0pCiAgICB7CiAgICAgICAgY2luID4+IG4gPj4gbTsKICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgbCwgcjsKICAgICAgICAgICAgY2luID4+IGwgPj4gcjsKICAgICAgICAgICAgYWRqW2xdLmVtcGxhY2VfYmFjayhyKTsKICAgICAgICAgICAgcmV2W3JdLmVtcGxhY2VfYmFjayhsKTsKICAgICAgICB9CgogICAgICAgIC8vIGNvdXQgPDwgZW5kbDsKCiAgICAgICAgYmZzKCk7CiAgICAgICAgZGlqa3N0cmEoKTsKCiAgICAgICAgLy8gZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgIC8vICAgICBjb3V0IDw8IGRpc3RbaV0gPDwgIiAiOwogICAgICAgIC8vIGNvdXQgPDwgZW5kbDsKCiAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgICAgICAgICBjb3V0IDw8IG1pbihkcFswXVtpXSwgZHBbMV1baV0pIDw8ICIgIjsKCiAgICAgICAgY291dCA8PCBlbmRsOwogICAgICAgIHJlc2V0KCk7CiAgICB9Cn0KLy8gTGV0IHlvdXIgc291bCB3YW5kZXIgd2hlcmUgZHJlYW1zIGFyZSBib3JuLg==