#include<bits/stdc++.h>
using namespace std;
const int N=1e5+1;
int n,m,dfs_time,id,mxlen=-1,mxnode=-1,par[N],low[N],num[N],com[N];
bool vis[N];
vector<vector<int> > tree,g;
vector<pair<int,int> > e;
map<pair<int,int>,bool>b;
void tar(int v){
vis[v]=1;
low[v]=num[v]=++dfs_time;
for(int i=0;i<g[v].size();++i){
int u=g[v][i];
if(!vis[u]){
par[u]=v;
tar(u);
low[v]=min(low[u],low[v]);
if(low[u]>num[v]){
b[make_pair(u,v)]=b[make_pair(v,u)]=true;
e.push_back(make_pair(u,v));
}
}
else if(par[v]!=u)
low[v]=min(num[u],low[v]);
}
}
void dfs(int x){
vis[x]=1;
com[x]=id;
for(int i=0;i<g[x].size();++i)
if(!vis[g[x][i]]&& !b[make_pair(x,g[x][i])])
dfs(g[x][i]);
}
void longest_path(int x,int p,int cost){
if(mxlen<cost)
mxlen=cost,mxnode=x;
for(int i=0;i<tree[x].size();++i){
if(tree[x][i]!=p)
longest_path(tree[x][i],x,cost+1);
}
}
void clear(){
memset(vis,0,sizeof vis);
memset(low,0,sizeof low);
memset(num,0,sizeof num);
memset(par,-1,sizeof par);
memset(com,-1,sizeof com);
mxlen=-1,mxnode=-1;
id=0;
dfs_time=0;
g.clear();
tree.clear();
b.clear();
e.clear();
}
int main(){
int ts;
scanf("%d",&ts);
while(ts--){
scanf("%d%d",&n,&m);
g.resize(n);
for(int i=0;i<m;++i){
int a,b;
scanf("%d%d",&a,&b);
--a;--b;
g[a].push_back(b);
g[b].push_back(a);
}
tar(0);
memset(vis,0,sizeof vis);
for(int i=0;i<n;++i){
if(!vis[i])
{
dfs(i);
++id;
}
}
tree.resize(id);
for(int i=0;i<e.size();++i){
int a=com[e[i].first];
int b=com[e[i].second];
tree[a].push_back(b);
tree[b].push_back(a);
}
// cout<<e.size()<<endl;
longest_path(0,-1,0);
mxlen=-1;
longest_path(mxnode,-1,0);
if(e.size()==0)
puts("0");
else
printf("%d\n",e.size()-mxlen);
clear();
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE49MWU1KzE7CmludCBuLG0sZGZzX3RpbWUsaWQsbXhsZW49LTEsbXhub2RlPS0xLHBhcltOXSxsb3dbTl0sbnVtW05dLGNvbVtOXTsKYm9vbCB2aXNbTl07CnZlY3Rvcjx2ZWN0b3I8aW50PiA+IHRyZWUsZzsKdmVjdG9yPHBhaXI8aW50LGludD4gPiBlOwptYXA8cGFpcjxpbnQsaW50Pixib29sPmI7CnZvaWQgdGFyKGludCB2KXsKICAgIHZpc1t2XT0xOwogICAgbG93W3ZdPW51bVt2XT0rK2Rmc190aW1lOwogICAgZm9yKGludCBpPTA7aTxnW3ZdLnNpemUoKTsrK2kpewogICAgICAgIGludCB1PWdbdl1baV07CiAgICAgICAgaWYoIXZpc1t1XSl7CiAgICAgICAgICAgIHBhclt1XT12OwogICAgICAgICAgICB0YXIodSk7CiAgICAgICAgICAgIGxvd1t2XT1taW4obG93W3VdLGxvd1t2XSk7CiAgICAgICAgICAgIGlmKGxvd1t1XT5udW1bdl0pewogICAgICAgICAgICAgICAgYlttYWtlX3BhaXIodSx2KV09YlttYWtlX3BhaXIodix1KV09dHJ1ZTsKICAgICAgICAgICAgICAgIGUucHVzaF9iYWNrKG1ha2VfcGFpcih1LHYpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHBhclt2XSE9dSkKICAgICAgICBsb3dbdl09bWluKG51bVt1XSxsb3dbdl0pOwoKICAgIH0KfQp2b2lkIGRmcyhpbnQgeCl7CiAgICB2aXNbeF09MTsKICAgIGNvbVt4XT1pZDsKICAgIGZvcihpbnQgaT0wO2k8Z1t4XS5zaXplKCk7KytpKQogICAgaWYoIXZpc1tnW3hdW2ldXSYmICFiW21ha2VfcGFpcih4LGdbeF1baV0pXSkKICAgIGRmcyhnW3hdW2ldKTsKfQp2b2lkIGxvbmdlc3RfcGF0aChpbnQgeCxpbnQgcCxpbnQgY29zdCl7CiAgICBpZihteGxlbjxjb3N0KQogICAgbXhsZW49Y29zdCxteG5vZGU9eDsKICAgIGZvcihpbnQgaT0wO2k8dHJlZVt4XS5zaXplKCk7KytpKXsKICAgICAgICBpZih0cmVlW3hdW2ldIT1wKQogICAgICAgIGxvbmdlc3RfcGF0aCh0cmVlW3hdW2ldLHgsY29zdCsxKTsKICAgIH0KfQp2b2lkIGNsZWFyKCl7CiAgICBtZW1zZXQodmlzLDAsc2l6ZW9mIHZpcyk7CiAgICBtZW1zZXQobG93LDAsc2l6ZW9mIGxvdyk7CiAgICBtZW1zZXQobnVtLDAsc2l6ZW9mIG51bSk7CiAgICBtZW1zZXQocGFyLC0xLHNpemVvZiBwYXIpOwogICAgbWVtc2V0KGNvbSwtMSxzaXplb2YgY29tKTsKICAgIG14bGVuPS0xLG14bm9kZT0tMTsKICAgIGlkPTA7CiAgICBkZnNfdGltZT0wOwogICAgZy5jbGVhcigpOwogICAgdHJlZS5jbGVhcigpOwogICAgYi5jbGVhcigpOwogICAgZS5jbGVhcigpOwogICAgfQppbnQgbWFpbigpewogICAgaW50IHRzOwogICAgc2NhbmYoIiVkIiwmdHMpOwogICAgd2hpbGUodHMtLSl7CiAgICBzY2FuZigiJWQlZCIsJm4sJm0pOwogICAgZy5yZXNpemUobik7CgogICAgZm9yKGludCBpPTA7aTxtOysraSl7CiAgICAgICAgaW50IGEsYjsKICAgICAgICBzY2FuZigiJWQlZCIsJmEsJmIpOwogICAgICAgIC0tYTstLWI7CiAgICAgICAgZ1thXS5wdXNoX2JhY2soYik7CiAgICAgICAgZ1tiXS5wdXNoX2JhY2soYSk7CgogICAgfQogICAgdGFyKDApOwogICAgbWVtc2V0KHZpcywwLHNpemVvZiB2aXMpOwogICAgZm9yKGludCBpPTA7aTxuOysraSl7CiAgICAgICAgaWYoIXZpc1tpXSkKICAgICAgICB7CiAgICAgICAgICAgIGRmcyhpKTsKICAgICAgICAgICAgKytpZDsKICAgICAgICB9CiAgICB9CiAgICB0cmVlLnJlc2l6ZShpZCk7CiAgICBmb3IoaW50IGk9MDtpPGUuc2l6ZSgpOysraSl7CiAgICAgICAgaW50IGE9Y29tW2VbaV0uZmlyc3RdOwogICAgICAgIGludCBiPWNvbVtlW2ldLnNlY29uZF07CiAgICAgICAgdHJlZVthXS5wdXNoX2JhY2soYik7CiAgICAgICAgdHJlZVtiXS5wdXNoX2JhY2soYSk7CiAgICB9CiAgIC8vIGNvdXQ8PGUuc2l6ZSgpPDxlbmRsOwogICAgbG9uZ2VzdF9wYXRoKDAsLTEsMCk7CiAgICBteGxlbj0tMTsKICAgIGxvbmdlc3RfcGF0aChteG5vZGUsLTEsMCk7CiAgICBpZihlLnNpemUoKT09MCkKICAgIHB1dHMoIjAiKTsKICAgIGVsc2UKICAgIHByaW50ZigiJWRcbiIsZS5zaXplKCktbXhsZW4pOwogICAgY2xlYXIoKTsKICAgIH0KCn0K