#include <bits/stdc++.h>
using namespace std;
#define int long long
#define mpr make_pair
#define fr first
#define sc second
inline int read(){
int res=0,f=1;char c=getchar();
while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}
while (c>='0'&&c<='9') {res=res*10+(c-'0');c=getchar();}
return res*f;
}
const int N=2e5+5;
int T,n,m,dep[N],f[N];
vector<int>te[N];
void dfs(int u,int fa){
dep[u]=dep[fa]+1;
f[u]=fa;
for (auto v:te[u]){
if (v==fa) continue;
dfs(v,u);
}
}
int fa[N];
struct node{
int x,y,w;
}be[N];
bool cmp(node o,node p){
return o.w>p.w;
}
int findx(int x){
if (x==fa[x]) return x;
fa[x]=findx(fa[x]);
return fa[x];
}
bitset<N>tmp;
void init(){
sort(be+1,be+m+1,cmp);
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=m;i++){
if (findx(be[i].x)!=findx(be[i].y)){
te[be[i].x].push_back(be[i].y);
te[be[i].y].push_back(be[i].x);
tmp[i]=1;
fa[findx(be[i].x)]=be[i].y;
}
}
}
stack<int>qwq;
void solve(){
n=read(),m=read();
for (int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
be[i]={u,v,w};
}
init();
for (int i=1;i<=n;i++){
if (!dep[i]) dfs(i,0);
}
int tip=m;
while (tmp[tip]&&m>=1) m--;
int u=be[tip].x,v=be[tip].y,_u=u,_v=v,_lca;
while (_u!=_v){
while (dep[_u]>=dep[_v]&&_u!=_v) _u=f[_u];
while (dep[_v]>=dep[_u]&&_u!=_v) _v=f[_v];
}
_lca=_u;
cout<<be[tip].w<<' '<<dep[u]+dep[v]-dep[_lca]*2+1<<'\n';
while (u!=_lca) cout<<u<<' ',u=f[u];
cout<<_lca<<' ';
while (v!=_lca) qwq.push(v),v=f[v];
while (!qwq.empty()) cout<<qwq.top()<<' ',qwq.pop();
cout<<'\n';
for (int i=1;i<=n;i++){
te[i].clear();
dep[i]=0;
}
for (int i=1;i<=m;i++) be[i]={0,0,0},tmp[i]=0;
}
signed main(){
T=read();
while (T--) solve();
return 0;
}