#define Plus_Cat "years"
#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define Fi first
#define Se second
#define ll long long
#define Pii pair<int,int>
#define RCL(a,b,c,d) memset(a,b,sizeof(c)*(d))
#define tomin(a,...) ((a)=min({(a),__VA_ARGS__}))
#define tomax(a,...) ((a)=max({(a),__VA_ARGS__}))
#define FOR(i,a,b) for(int i(a); i<=(int)(b); ++i)
#define DOR(i,a,b) for(int i(a); i>=(int)(b); --i)
#define EDGE(g,i,x,y) for(int i(g.h[x]),y(g[i].v); ~i; y=g[(i=g[i].nxt)>=0?i:0].v)
using namespace std;
constexpr int N(15+10),M(210+10),V(105*105+10);
#define DE(...) E(#__VA_ARGS__,__VA_ARGS__)
struct Ecat {
template<class T>void operator ()(const char *fmt,const T a) {
return cerr<<fmt<<":"<<a<<".\n",void();
}
template<class T,class...Types>void operator ()(const char *fmt,const T a,const Types...args) {
while(*fmt!=',')cerr<<*fmt++;
return cerr<<':'<<a<<", ",(*this)(++fmt,args...);
}
} E;
namespace Modular {
#define Mod 1000000007
template<class T1,class T2>constexpr auto add(const T1 a,const T2 b) {
return a+b>=Mod?a+b-Mod:a+b;
}
template<class T1,class T2>T1 &toadd(T1 &a,const T2 b) {
return a=add(a,b);
}
template<class T1,class T2>constexpr auto mul(const T1 a,const T2 b) {
return (ll)a*b%Mod;
}
template<class T1,class T2>T1 &tomul(T1 &a,const T2 b) {
return a=mul(a,b);
}
int Pow(int a,int b=Mod-2) {
int res(1);
for(a%=Mod; b; b>>=1,tomul(a,a))if(b&1)tomul(res,a);
return res;
}
} using namespace Modular;
int ID,Cas,n,m,ans;
int u[M],v[M],w[M];
struct CFS {
int tot,h[N];
struct edge {
int v,w,nxt;
edge(int v=0,int w=0,int nxt=-1):v(v),w(w),nxt(nxt) {}
} e[M];
edge &operator [](int i) { return e[i]; }
void Init(int n) { tot=-1,RCL(h+1,-1,int,n); }
void Erase(int u) { h[u]=e[h[u]].nxt,--tot; }
void att(int u,int v,int w) { e[++tot]=edge(v,w,h[u]),h[u]=tot; }
void con(int u,int v,int w) { att(u,v,w),att(v,u,w); }
} g;
namespace Sub1 {
bool vis[N];
int dis[N][N],Dis[N][N];
struct edge { int u,v; };
vector<edge> V[3];
bool Check() {
FOR(i,1,m)if(w[i]>3)return false;
return ID<=3&&n<=6&&m<=6;
}
void dfs(int i) {
if(i>m) {
bool flag(0);
RCL(dis,INF,dis,1);
FOR(i,1,n)dis[i][i]=1;
for(edge e:V[1])dis[e.u][e.v]=1;
FOR(k,1,n)FOR(i,1,n)FOR(j,1,n)tomin(dis[i][j],dis[i][k]+dis[k][j]);
FOR(i,1,n) {
vis[i]=1;
FOR(j,1,n)if(Dis[i][j]<INF)vis[i]&=(dis[i][j]<INF);
}
for(edge e:V[2])if(vis[e.v])tomin(dis[e.u][e.v],2);
FOR(k,1,n)FOR(i,1,n)FOR(j,1,n)tomin(dis[i][j],dis[i][k]+dis[k][j]);
FOR(i,1,n) {
int cnt(0);
FOR(j,1,n)cnt+=(dis[i][j]<INF);
if(cnt==n)flag=1;
}
ans+=flag;
return;
}
dfs(i+1);
V[w[i]].push_back({u[i],v[i]}),dfs(i+1),V[w[i]].pop_back();
V[w[i]].push_back({v[i],u[i]}),dfs(i+1),V[w[i]].pop_back();
V[w[i]].push_back({u[i],v[i]}),V[w[i]].push_back({v[i],u[i]}),dfs(i+1);
V[w[i]].pop_back(),V[w[i]].pop_back();
}
int Cmain() {
RCL(Dis,INF,Dis,1);
FOR(i,1,n)Dis[i][i]=1;
FOR(i,1,m)if(w[i]==1)tomin(Dis[u[i]][v[i]],1),tomin(Dis[v[i]][u[i]],1);
FOR(k,1,n)FOR(i,1,n)FOR(j,1,n)tomin(Dis[i][j],Dis[i][k]+Dis[k][j]);
dfs(1),printf("%d\n",mul(ans,Pow(Pow(2,m<<1))));
return 0;
}
}
int Cmain() {
scanf("%d%d",&n,&m),g.Init(n),ans=0;
FOR(i,1,m)scanf("%d%d%d",&u[i],&v[i],&w[i]);
if(Sub1::Check())return Sub1::Cmain();
return 0;
}
int main() {
#ifdef Plus_Cat
freopen(Plus_Cat ".in","r",stdin),freopen(Plus_Cat ".out","w",stdout);
#endif
for(scanf("%d%d",&ID,&Cas); Cas; --Cas)Cmain();
return 0;
}