#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m ,low[100001],num[100001],par[100001],id,T,comid,com_id[100001];
map<pair<int,int>,bool>there;
bool vis[100001];
vector<vector<int> > v;
vector<pair<int,int> >edges;
void dfs(int u){
num[u]=low[u]=++id;
vis[u]=1;
for(int i=0;i<v[u].size();++i){
int node=v[u][i];
if(!vis[node]){
par[node]=u;
dfs(node);
low[u]=min(low[node],low[u]);
if (low[node] > num[u])
{
there[make_pair(node,u)]=1;
there[make_pair(u,node)]=1;
}
}
else if(node!=par[u])
low[u]=min(low[u],num[node]);
}
}
void dfs2(int x){
vis[x]=1;
com_id[x]=comid;
for(int i=0;i<v[x].size();++i){
int y=v[x][i];
if(!vis[y])
{
dfs(y);
}
}
}
int mxlen,mxnode;
void dfs3(int x,int p,int cost){
if(cost>mxlen)
mxlen=cost,mxnode=x;
for(int i=0;i<v[x].size();++i)
if(v[x][i]!=p)
dfs3(v[x][i],x,cost+1);
}
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
v.resize(n);
for(int i=0,a,b;i<m;++i) {
scanf("%d%d",&a,&b);
--a;--b;
v[a].push_back(b);
v[b].push_back(a);
edges.push_back(make_pair(a,b));
}
dfs(0);
v.clear();
v.resize(n);
vector<pair<int,int> > B;
for(int i=0;i<m;++i)
{
int a=edges[i].first;
int b=edges[i].second;
if(!there[make_pair(edges[i].first,edges[i].second)])
{
v[a].push_back(b);
v[b].push_back(a);
}else{
B.push_back(make_pair(a,b));
}
}
memset(vis,0,sizeof vis);
for(int i=0;i<n;++i){
if(!vis[i]){
dfs2(i);
++comid;
}
}
v.clear();
v.resize(comid);
for(int i=0;i<B.size();++i){
int a=com_id[B[i].first];
int b=com_id[B[i].second];
v[a].push_back(b);
v[b].push_back(a);
}
dfs3(0,-1,0);
mxlen=0;
dfs3(mxnode,-1,0);
memset(vis,0,sizeof vis);
memset(par,-1,sizeof par);
memset(num,0,sizeof num);
memset(com_id,0,sizeof com_id);
memset(low,0,sizeof low);
id=0;
comid=0;
there.clear();
v.clear();
edges.clear();
mxlen=0;
mxnode=0;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmludCBuLG0gLGxvd1sxMDAwMDFdLG51bVsxMDAwMDFdLHBhclsxMDAwMDFdLGlkLFQsY29taWQsY29tX2lkWzEwMDAwMV07Cm1hcDxwYWlyPGludCxpbnQ+LGJvb2w+dGhlcmU7CmJvb2wgdmlzWzEwMDAwMV07CnZlY3Rvcjx2ZWN0b3I8aW50PiA+IHY7CnZlY3RvcjxwYWlyPGludCxpbnQ+ID5lZGdlczsgICAgCnZvaWQgZGZzKGludCB1KXsKICAgIG51bVt1XT1sb3dbdV09KytpZDsKICAgIHZpc1t1XT0xOwogICAgZm9yKGludCBpPTA7aTx2W3VdLnNpemUoKTsrK2kpewogICAgICAgIGludCBub2RlPXZbdV1baV07CiAgICAKICAgICAgICBpZighdmlzW25vZGVdKXsKICAgICAgICAJCiAgICAgICAgCXBhcltub2RlXT11OwogICAgICAgICAgICBkZnMobm9kZSk7CiAgICAgICAgICAgIGxvd1t1XT1taW4obG93W25vZGVdLGxvd1t1XSk7CiAgICAgICAgICBpZiAobG93W25vZGVdID4gbnVtW3VdKQogICAgICAgICAgICB7ICAgICAgICAKICAgICAgICAgICAgICAgIHRoZXJlW21ha2VfcGFpcihub2RlLHUpXT0xOwogICAgICAgICAgICAgICAgdGhlcmVbbWFrZV9wYWlyKHUsbm9kZSldPTE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZihub2RlIT1wYXJbdV0pCiAgICAgICAgbG93W3VdPW1pbihsb3dbdV0sbnVtW25vZGVdKTsKICAgIH0KfQp2b2lkIGRmczIoaW50IHgpewogICAgdmlzW3hdPTE7CiAgICBjb21faWRbeF09Y29taWQ7CiAgICBmb3IoaW50IGk9MDtpPHZbeF0uc2l6ZSgpOysraSl7CiAgICAgICAgaW50IHk9dlt4XVtpXTsKICAgICAgICBpZighdmlzW3ldKQogICAgICAgIHsKICAgICAgICAgICAgZGZzKHkpOwogICAgICAgIH0KICAgIH0KfQppbnQgbXhsZW4sbXhub2RlOwp2b2lkIGRmczMoaW50IHgsaW50IHAsaW50IGNvc3QpewogICAgaWYoY29zdD5teGxlbikKICAgIG14bGVuPWNvc3QsbXhub2RlPXg7CiAgICBmb3IoaW50IGk9MDtpPHZbeF0uc2l6ZSgpOysraSkKICAgICAgICBpZih2W3hdW2ldIT1wKQogICAgICAgICAgICBkZnMzKHZbeF1baV0seCxjb3N0KzEpOwp9CmludCBtYWluKCl7CiAgICBzY2FuZigiJWQiLCZUKTsKICAgIHdoaWxlKFQtLSl7CiAgICAgICAgc2NhbmYoIiVkJWQiLCZuLCZtKTsKICAgICAgICB2LnJlc2l6ZShuKTsKICAgICAgICBmb3IoaW50IGk9MCxhLGI7aTxtOysraSkgIHsKICAgICAgICAgICAgc2NhbmYoIiVkJWQiLCZhLCZiKTsKICAgICAgICAgICAgLS1hOy0tYjsKICAgICAgICAgICAgdlthXS5wdXNoX2JhY2soYik7CiAgICAgICAgICAgIHZbYl0ucHVzaF9iYWNrKGEpOwogICAgICAgICAgICBlZGdlcy5wdXNoX2JhY2sobWFrZV9wYWlyKGEsYikpOwogICAgICAgIH0gICAgICAKICAgICAgICBkZnMoMCk7CiAgICAgICAgdi5jbGVhcigpOwogICAgICAgIHYucmVzaXplKG4pOwogICAgICAgIHZlY3RvcjxwYWlyPGludCxpbnQ+ID4gQjsKICAgICAgICBmb3IoaW50IGk9MDtpPG07KytpKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGE9ZWRnZXNbaV0uZmlyc3Q7CiAgICAgICAgICAgIGludCBiPWVkZ2VzW2ldLnNlY29uZDsKICAgICAgICAgICAgaWYoIXRoZXJlW21ha2VfcGFpcihlZGdlc1tpXS5maXJzdCxlZGdlc1tpXS5zZWNvbmQpXSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHZbYV0ucHVzaF9iYWNrKGIpOwogICAgICAgICAgICAgICAgIHZbYl0ucHVzaF9iYWNrKGEpOwogICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgIEIucHVzaF9iYWNrKG1ha2VfcGFpcihhLGIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAKICAgICAgICBtZW1zZXQodmlzLDAsc2l6ZW9mIHZpcyk7CiAgICAgICAgZm9yKGludCBpPTA7aTxuOysraSl7CiAgICAgICAgICAgIGlmKCF2aXNbaV0pewogICAgICAgICAgICAgICAgZGZzMihpKTsKICAgICAgICAgICAgICAgICsrY29taWQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdi5jbGVhcigpOwogICAgICAgIHYucmVzaXplKGNvbWlkKTsKICAgICAgICBmb3IoaW50IGk9MDtpPEIuc2l6ZSgpOysraSl7CiAgICAgICAgICAgIGludCBhPWNvbV9pZFtCW2ldLmZpcnN0XTsKICAgICAgICAgICAgaW50IGI9Y29tX2lkW0JbaV0uc2Vjb25kXTsKICAgICAgICAgICAgdlthXS5wdXNoX2JhY2soYik7CiAgICAgICAgICAgIHZbYl0ucHVzaF9iYWNrKGEpOwogICAgICAgIH0KICAgICAgICBkZnMzKDAsLTEsMCk7CiAgICAgICAgbXhsZW49MDsKICAgICAgICBkZnMzKG14bm9kZSwtMSwwKTsKICAgICAgICBtZW1zZXQodmlzLDAsc2l6ZW9mIHZpcyk7CiAgICAgICAgbWVtc2V0KHBhciwtMSxzaXplb2YgcGFyKTsKICAgICAgICBtZW1zZXQobnVtLDAsc2l6ZW9mIG51bSk7CiAgICAgICAgbWVtc2V0KGNvbV9pZCwwLHNpemVvZiBjb21faWQpOwogICAgICAgIG1lbXNldChsb3csMCxzaXplb2YgbG93KTsKICAgICAgICBpZD0wOwogICAgICAgIAogICAgICAgIGNvbWlkPTA7CiAgICAgICAgdGhlcmUuY2xlYXIoKTsKICAgICAgICB2LmNsZWFyKCk7CiAgICAgICAgZWRnZXMuY2xlYXIoKTsKICAgICAgICBteGxlbj0wOwogICAgICAgIG14bm9kZT0wOwoKICAgIH0gICAKfQ==