#include #define mod 1000000007 #define int long long using namespace std; int read(){ int n,f=1; char c; while (!isdigit(c=getchar())) f=(c=='-'?-1:1); n=c-'0'; while (isdigit(c=getchar())) n=n*10+c-'0'; return n*f; } void write(int x){ if (x>=10) write(x/10); putchar(x%10+'0'); } void write_(int x,char c){ if (x<0) putchar('-'), x=-x; write(x); putchar(c); } int fpow(int a,int b){ if (!b) return 1ll; int t=fpow(a,b>>1); if (b&1) return t*t%mod*a%mod; return t*t%mod; } int frac[100005], inv[100005], inv1[100005], maxn=100000; void Init(){ frac[0]=inv[0]=1; inv1[0]=1; for (int i=1;i<=maxn;i++) frac[i]=frac[i-1]*i%mod; inv[maxn]=fpow(frac[maxn],mod-2); for (int i=maxn-1;i>=1;i--) inv[i]=inv[i+1]*(i+1)%mod; for (int i=1;i<=maxn;i++) inv1[i]=inv[i]*frac[i-1]%mod; return ; } struct Edge{ int u,v; }Ed[100005]; int tag[100005]; int n,m; vector ed[100005]; int cnt[100005], used[100005]; int Rt; int ans, zzp=1; int f[100005]; //void Add(int u){ // cur=cur*inv1[cnt[u]-1]%mod; // return ; //} // //void calc(int u){ //// if (used[u]==cnt[u]) printf("Err: %lld>\n",u); // cur=cur*inv1[used[u]]%mod; // used[u]++; // cur=cur*used[u]%mod; //} // //void Sub(int u,int t1,int t2){ //// if (cnt[u]==used[u]) return cur=0,void(); // cur=cur*inv1[used[u]]%mod; // used[u]--; // cur=cur*used[u]%mod; //} void dfs(int u,int fat,int cur){ if (cnt[u]==1) return ; cur=cur*inv1[cnt[u]-1]; for (auto Id:ed[u]){ if (Id==fat) continue; int v=Ed[Id].u+Ed[Id].v-u; if (tag[Id]){ ans=(ans-cur-f[u])%mod; dfs(v,Id,zzp); f[u]=(f[u]+zzp*inv1[cnt[u]-1]%mod)%mod; }else{ dfs(v,Id,(cur+f[u])%mod); f[u]=(f[u]+f[v]*inv1[cnt[u]-1]%mod)%mod; } } } void Solve(){ n=read(); m=read(); for (int i=1;i<=n;i++) ed[i].clear(), cnt[i]=0, tag[i]=0, used[i]=0, f[i]=0; for (int i=1;i\n",zzp); dfs(Ed[Rt].u,Rt,zzp); dfs(Ed[Rt].v,Rt,zzp); write_((ans%mod+mod)%mod,'\n'); } signed main(){ Init(); freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); int c,t; c=read(); t=read(); while (t--) Solve(); } /* 1 1 6 3 1 2 2 3 3 4 4 5 5 6 2 5 1 */