#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
const int N=25;
const ll mod=1e9+7,Q=250000002;
ll ans;
int c,t,n,m,MST;
bool b[N][N];
struct edge{
int x,y,w;
}e[N*N],p[N*N];
int fa[N],tp[N*N];
ll f[1<<15],g[1<<15];
int get(int x){
if(x!=fa[x]) return fa[x]=get(fa[x]);
return fa[x];
}
bool cmp(edge x,edge y){
return x.w<y.w;
}
int mst(int ct){
for(int i=1;i<=n;i++) fa[i]=i;
sort(p+1,p+ct+1,cmp);int now=0,ans=0;
for(int i=1;i<=ct;i++){
int x=get(p[i].x),y=get(p[i].y),w=p[i].w;
if(x==y) continue;
fa[x]=y,ans+=w,now++;
if(now==n-1) break;
}
if(now<n-1) return 0x3f3f3f3f;
return ans;
}
bool vis[N];
int s,RES;
vector<edge>E;
void D(int u,int sum,int cnt){
if(sum>MST||RES==MST) return;
if(cnt==n-1){
RES=sum;
return;
}
vis[u]=1;
for(edge e:E){
if(e.x==u){
if(!vis[e.y]){
D(e.y,sum+e.w,cnt+1);
}
}
}
vis[u]=0;
}
void dfs(int k){
if(k==m+1){
int res=0x3f3f3f3f;
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
RES=0x3f3f3f3f;
D(i,0,0);
if(RES==MST){
ans++;
break;
}
}
return;
}
dfs(k+1);
E.pb({e[k].x,e[k].y,e[k].w});
dfs(k+1);
E.pop_back();
E.pb({e[k].y,e[k].x,e[k].w});
dfs(k+1);
E.pop_back();
E.pb({e[k].x,e[k].y,e[k].w});
E.pb({e[k].y,e[k].x,e[k].w});
dfs(k+1);
E.pop_back();E.pop_back();
}
ll qp(ll x,ll y){
ll res=1;
while(y){
if(y&1) res=res*x%mod;
x=x*x%mod,y>>=1;
}
return res;
}
int main(){
freopen("years.in","r",stdin);
freopen("years.out","w",stdout);
scanf("%d%d",&c,&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) b[i][j]=0;
ll pw=1;ans=0;
for(int i=1;i<=m;i++){
scanf("%d%d%d",&e[i].x,&e[i].y,&e[i].w),p[i]=e[i];
b[e[i].x][e[i].y]=b[e[i].y][e[i].x]=1;
}
if(c>=4&&c<=6){
ll iv=(mod+1)/2;
ans=(n-1)*qp(iv,n-2)%mod*iv%mod*iv%mod;
(ans+=qp(iv,n-1))%=mod;
printf("%lld\n",ans);
continue;
}
}
return 0;
}