#include //事前処理とUnion-Find using std::cin; using std::cout; using std::endl; using std::vector; using ll=long long; const int MOD=1e9+7; struct Union_Find{ int N; vector par; Union_Find(int n):N(n){ par.resize(N); for(int i=0;i0){ if(Y%2){ ret*=X; ret%=MOD; } Y/=2; X*=X; X%=MOD; } return ret; } void dfs(int N,int X,int now,vector &seen,vector> &edge,vector> &weight,vector &subtree,ll &ans){ seen[now]=1; for(int i=0;i>N>>M>>X; ll max=2e5,max2=1e9;; assert(2<=N&&N<=max&&N-1<=M&&M<=max&&2<=X&&X<=max2); vector> edge(N),weight(N); Union_Find UF(N); //最小全域木を作る ll memo=-1; for(int i=0;i>x>>y>>z; assert(1<=x&&x<=N&&1<=y&&y<=N&&0<=z&&z<=max2); assert(memo subtree(N); vector seen(N); ll ans=0; dfs(N,X,0,seen,edge,weight,subtree,ans); cout<