#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
const int N = 1e5 + 5;
vector<int> G[N], g[N];
int n, m;
int num[N], low[N], color[N], stt = 0, scc = 0, Bridge = 0;
stack<int> stk;
void dfs(int u, int pre) {
num[u] = low[u] = ++stt;
stk.push(u);
for (int v: G[u]) {
if (v == pre) {
pre = 0;
continue;
}
if (!num[v]) {
dfs(v, u);
low[u] = min(low[u], low[v]);
if (low[v] > num[u]) {
Bridge++;
int i;
++scc;
do {
i = stk.top(); stk.pop();
color[i] = scc;
} while(i != v);
}
}
else low[u] = min(low[u], num[v]);
}
}
void BridgeTree() {
for (int u = 1; u <= n; u++) {
for (int v: G[u]) if (color[u] != color[v]) {
g[color[u]].push_back(color[v]);
}
}
}
int Node, maxLen;
void dfsFurthest(int u, int pre, int len) {
num[u] = 1;
if (len > maxLen) maxLen = len, Node = u;
for (int v: g[u]) if (v != pre) dfsFurthest(v, u, len + 1);
}
void solve() {
cin >> n >> m;
stk = {};
for (int i = 1; i <= n; i++) {
G[i] = g[i] = {};
num[i] = low[i] = color[i] = 0;
}
stt = scc = Bridge = 0;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
for (int i = 1; i <= n; i++) if (!num[i]) dfs(i, i);
BridgeTree();
int ans = 0;
fill(num + 1, num + n + 1, 0);
for (int u = 1; u <= n; u++) if (!num[u]) {
int A = u;
Node = A, maxLen = 0;
dfsFurthest(A, A, 0);
A = Node;
dfsFurthest(A, A, 0);
ans = max(ans, maxLen);
}
cout << Bridge - ans << "\n";
}
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("Input.inp")) {
freopen("Input.inp", "r", stdin);
freopen("Output.out", "w", stdout);
}
int tt; cin >> tt;
while(tt--) {
solve();
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+IC8vIE5lT1dhbWkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZnQgZmlyc3QKI2RlZmluZSBzYyBzZWNvbmQKY29uc3QgaW50IE4gPSAxZTUgKyA1Owp2ZWN0b3I8aW50PiBHW05dLCBnW05dOwppbnQgbiwgbTsKaW50IG51bVtOXSwgbG93W05dLCBjb2xvcltOXSwgc3R0ID0gMCwgc2NjID0gMCwgQnJpZGdlID0gMDsKc3RhY2s8aW50PiBzdGs7CnZvaWQgZGZzKGludCB1LCBpbnQgcHJlKSB7CiAgICBudW1bdV0gPSBsb3dbdV0gPSArK3N0dDsKICAgIHN0ay5wdXNoKHUpOwogICAgZm9yIChpbnQgdjogR1t1XSkgewogICAgICAgIGlmICh2ID09IHByZSkgewogICAgICAgICAgICBwcmUgPSAwOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFudW1bdl0pIHsKICAgICAgICAgICAgZGZzKHYsIHUpOwogICAgICAgICAgICBsb3dbdV0gPSBtaW4obG93W3VdLCBsb3dbdl0pOwogICAgICAgIAogICAgICAgICAgICBpZiAobG93W3ZdID4gbnVtW3VdKSB7CiAgICAgICAgICAgICAgICBCcmlkZ2UrKzsKICAgICAgICAgICAgICAgIGludCBpOwogICAgICAgICAgICAgICAgKytzY2M7CiAgICAgICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgICAgaSA9IHN0ay50b3AoKTsgc3RrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIGNvbG9yW2ldID0gc2NjOwogICAgICAgICAgICAgICAgfSB3aGlsZShpICE9IHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgbG93W3VdID0gbWluKGxvd1t1XSwgbnVtW3ZdKTsKICAgIH0KfQp2b2lkIEJyaWRnZVRyZWUoKSB7CiAgICBmb3IgKGludCB1ID0gMTsgdSA8PSBuOyB1KyspIHsKICAgICAgICBmb3IgKGludCB2OiBHW3VdKSBpZiAoY29sb3JbdV0gIT0gY29sb3Jbdl0pIHsKICAgICAgICAgICAgZ1tjb2xvclt1XV0ucHVzaF9iYWNrKGNvbG9yW3ZdKTsKICAgICAgICB9CiAgICB9Cn0KCmludCBOb2RlLCBtYXhMZW47CnZvaWQgZGZzRnVydGhlc3QoaW50IHUsIGludCBwcmUsIGludCBsZW4pIHsKICAgIG51bVt1XSA9IDE7CiAgICBpZiAobGVuID4gbWF4TGVuKSBtYXhMZW4gPSBsZW4sIE5vZGUgPSB1OwogICAgZm9yIChpbnQgdjogZ1t1XSkgaWYgKHYgIT0gcHJlKSBkZnNGdXJ0aGVzdCh2LCB1LCBsZW4gKyAxKTsKfQoKdm9pZCBzb2x2ZSgpIHsKICAgIGNpbiA+PiBuID4+IG07CiAgICBzdGsgPSB7fTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIEdbaV0gPSBnW2ldID0ge307CiAgICAgICAgbnVtW2ldID0gbG93W2ldID0gY29sb3JbaV0gPSAwOwogICAgfQogICAgc3R0ID0gc2NjID0gQnJpZGdlID0gMDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG07IGkrKykgewogICAgICAgIGludCB1LCB2OyBjaW4gPj4gdSA+PiB2OwogICAgICAgIEdbdV0ucHVzaF9iYWNrKHYpOwogICAgICAgIEdbdl0ucHVzaF9iYWNrKHUpOwogICAgfQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBpZiAoIW51bVtpXSkgZGZzKGksIGkpOwogICAgQnJpZGdlVHJlZSgpOwogICAgaW50IGFucyA9IDA7CiAgICBmaWxsKG51bSArIDEsIG51bSArIG4gKyAxLCAwKTsKICAgIGZvciAoaW50IHUgPSAxOyB1IDw9IG47IHUrKykgaWYgKCFudW1bdV0pIHsKICAgICAgICBpbnQgQSA9IHU7CiAgICAgICAgTm9kZSA9IEEsIG1heExlbiA9IDA7CiAgICAgICAgZGZzRnVydGhlc3QoQSwgQSwgMCk7CiAgICAgICAgQSA9IE5vZGU7CiAgICAgICAgZGZzRnVydGhlc3QoQSwgQSwgMCk7CiAgICAgICAgYW5zID0gbWF4KGFucywgbWF4TGVuKTsKICAgIH0KICAgIGNvdXQgPDwgQnJpZGdlIC0gYW5zIDw8ICJcbiI7Cn0KCnNpZ25lZCBtYWluKCkgewogICAgY2luLnRpZShOVUxMKS0+c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGlmKGlmc3RyZWFtKCJJbnB1dC5pbnAiKSkgewogICAgICAgIGZyZW9wZW4oIklucHV0LmlucCIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4oIk91dHB1dC5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBpbnQgdHQ7IGNpbiA+PiB0dDsKICAgIHdoaWxlKHR0LS0pIHsKICAgICAgICBzb2x2ZSgpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=