#include<bits/stdc++.h>
#define LL long long
#define pc __builtin_popcount
#define fr(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
using namespace std;
const int N=17,M=305,mod=1e9+7;
int id,T,n,m;int mn,fa[N];
inline int gf(int x){return x==fa[x]?x:fa[x]=gf(fa[x]);}
struct node{int u,v,w;}e[M];
inline int ksm(int x,int p){int s=1;for(;p;(p&1)&&(s=1ll*s*x%mod),x=1ll*x*x%mod,p>>=1);return s;}
namespace sol1
{
bool f[1<<12|5],vis[N];
basic_string<int>E[N];
inline void KR()
{
iota(fa+1,fa+1+n,1);mn=0;
for(int i=1;i<=m;i++)
{
auto [u,v,w]=e[i];u=gf(u),v=gf(v);
if(u!=v) fa[v]=u,mn+=w;
}
}
void dfs(int x)
{
vis[x]=1;
for(int i:E[x]) if(!vis[i]) dfs(i);
}
inline void sol()
{
KR();
for(int i=1;i<=m;i++) e[i+m]=e[i],swap(e[i+m].u,e[i+m].v);
memset(f,0,sizeof(f));m<<=1;
for(int i=0;i<(1<<m);i++) if(pc(i)==n-1)
{
int s=0;
fill(fa+1,fa+1+n,0);fill(vis+1,vis+1+n,0);
for(int i=1;i<=n;i++) E[i].clear();
for(int j=0;j<m;j++) if(i>>j&1)
{
auto [u,v,w]=e[j+1];
fa[v]=u,s+=w;E[u]+=v;
}
if(s!=mn) continue;
for(int j=1;j<=n;j++) if(!fa[j]){dfs(j);break;}
bool o=1;
for(int j=1;j<=n;j++) if(!vis[j]){o=0;break;}
f[i]=o;
}
for(int j=0;j<m;j++) for(int i=0;i<(1<<m);i++) if(i>>j&1)
f[i]|=f[i^(1<<j)];
int c=0;
for(int i=0;i<(1<<m);i++) c+=f[i];
cout<<(1ll*c*ksm(1<<m,mod-2)%mod)<<"\n";
}
}
inline bool difw()
{
for(int i=1;i<n;i++) if(e[i].w==e[i+1].w) return 0;
return 1;
}
namespace sol2
{
inline void sol()
{
cout<<(2ll*(2*n-1)*ksm(1<<((n-1)*2),mod-2)%mod)<<"\n";
}
}
int main()
{
fr(years)
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);cin>>id>>T;
while(T--)
{
cin>>n>>m;
for(int i=1,u,v,w;i<=m;i++) cin>>u>>v>>w,e[i]={u,v,w};
sort(e+1,e+1+m,[](node x,node y){return x.w<y.w;});
if(max(n,m)<=6){sol1::sol();continue;}
if(difw()){sol2::sol();continue;}
}
return 0;
}