#include using namespace std; inline int read(){ int s=0,d=1; char c=getchar(); while(c>'9'||c<'0'){ if(c=='-')d=-1; c=getchar(); } while(c<='9'&&c>='0'){ s=s*10+c-'0'; c=getchar(); } return s*d; } const int mod=1000000007; void add(int &x,int y){ x+=y;if(x>=mod)x-=mod;return ; } #define maxn 100009 #define pb push_back #define mp make_pair #define fi first #define se second vector > to[maxn]; int c,t,n,k,d[maxn],ans=0; int e[maxn],fac[maxn],inv[maxn]; bool sel[maxn]; int fp(int x,int y){ int z=1; while(y){ if(y&1)z=1ll*z*x%mod; y>>=1;x=1ll*x*x%mod; } return z; } int cnt[maxn]; bool opt[maxn]; int id[maxn],z[maxn],fa[maxn],top=0; void work(int u,int f=0){ /* if(d[u]==1){ if(to[u][0].fi^f)work(to[u][0].fi,u); return ; } int invd=1ll*fac[d[u]-2]*inv[d[u]-1]%mod; for(auto edge:to[u])if(edge.fi^f){ int v=edge.fi; bool opt=sel[edge.se]; work(v,u); if(opt){ add(ans,mod-1ll*cnt[v]*invd%mod); add(cnt[v],1); } add(ans,mod-1ll*cnt[u]*cnt[v]%mod*invd%mod); add(cnt[u],cnt[v]); } cnt[u]=1ll*cnt[u]*invd%mod; */ for(int i=1;i<=n;i++)id[i]=0,opt[i]=false; top=1;z[top]=u;fa[1]=f; while(top){ int nu=z[top],nf=fa[nu]; if(to[nu][id[nu]].fi^nf){ int v=to[nu][id[nu]].fi; opt[v]=sel[to[nu][id[nu]].se]; z[++top]=v;fa[v]=nu; } id[nu]++; while(top&&id[z[top]]==(int)to[z[top]].size()){ nu=z[top],nf=fa[nu]; if(d[nu]>1){ int invd=1ll*fac[d[nu]-2]*inv[d[nu]-1]%mod; cnt[nu]=1ll*cnt[nu]*invd%mod; } if(nf){ int invd=(d[nf]>1)?1ll*fac[d[nf]-2]*inv[d[nf]-1]%mod:1; if(opt[nu]){ add(ans,mod-1ll*(mod-1)*cnt[nu]%mod); cnt[nu]=mod-1; } add(ans,mod-1ll*cnt[nf]*cnt[nu]%mod*invd%mod); add(cnt[nf],cnt[nu]); } top--; } } return ; } int main(){ freopen("traverse.in","r",stdin); freopen("traverse.out","w",stdout); c=read();t=read(); fac[0]=1;for(int i=1;i