#include #define N 100011 using namespace std; const int p=1e9+7; namespace IO { char Is[(1<<21)+10],Os[(1<<21)+10];int Ipt=1<<21,Opt; char gc() { if(Ipt==(1<<21))Is[fread(Is,1,1<<21,stdin)]=0,Ipt=0; // putchar(Is[Ipt]); return Is[Ipt++]; } void flush(){fwrite(Os,1,Opt,stdout);Opt=0;} void pc(char x) { Os[Opt++]=x; if(Opt==(1<<21))flush(); } // #define gc getchar // #define pc putchar int read() { int x=0;char c=gc(); while(c<'0'||c>'9')c=gc(); while(c<='9'&&c>='0')x=x*10+c-'0',c=gc(); return x; } void write(int x){if(x<10)pc(x+'0');else write(x/10),pc(x%10+'0');} } using namespace IO; int T,n,k,rt;vector G[N]; bool inK[N]; int dp[N][4],fac[N],eu[N],ev[N],fa[N]; void dfs0(int u,int F) { fa[u]=F; for(int v:G[u])if(v^F) { dfs0(v,u); } } void dfs(int u,int F) {//printf("dfs(%d,%d)\n",u,F); for(int v:G[u])if(v^F)dfs(v,u); if(G[u].size()==1) { dp[u][2|inK[u]]=1; // printf("dp[%d]:{%d,%d,%d,%d}\n",u,dp[u][0],dp[u][1],dp[u][2],dp[u][3]); return; } if(u!=rt) { int tt[5]={0,0,0,0,1}; for(int v:G[u])if(v^F) { int ntt[5]={0,0,0,0,0}; for(int o=0;o<4;++o) { if(o>=2)for(int _=0;_<5;++_)ntt[_]=(ntt[_]+1ll*tt[_]*dp[v][o])%p; ntt[o]=(ntt[o]+1ll*tt[4]*dp[v][o])%p; } for(int _=0;_<5;++_)tt[_]=ntt[_]; } for(int o=0;o<4;++o)dp[u][o]=tt[o]; } { int tt[7]={0,0,0,0,1,0,0};// 0123: choose 1, 4: choose 0, 5,6: choose 2, final state for(int v:G[u])if(v^F) { int ntt[7]={0,0,0,0,0,0,0}; for(int o=0;o<4;++o) { if(o>=2)for(int _=0;_<7;++_)ntt[_]=(ntt[_]+1ll*tt[_]*dp[v][o])%p; ntt[o]=ntt[o]+(1ll*tt[4]*dp[v][o])%p; for(int y=0;y<4;++y) { int typ=(o>=2)+(y>=2); if(typ==2)ntt[5+(o|y)-2]=(ntt[5+(o|y)-2]+1ll*tt[y]*dp[v][o])%p; if(typ==1)ntt[5+min(o,y)]=(ntt[5+min(o,y)]+1ll*tt[y]*dp[v][o])%p; } } for(int _=0;_<7;++_)tt[_]=ntt[_]; // printf("v:%d ntt:{{%d,%d,%d,%d},%d,{%d,%d}}\n",v,tt[0],tt[1],tt[2],tt[3],tt[4],tt[5],tt[6]); } dp[u][0]=(dp[u][0]+tt[5])%p; dp[u][1]=(dp[u][1]+tt[6])%p; } if(inK[u]) { dp[u][3]=(dp[u][3]+dp[u][2])%p; dp[u][2]=0; } // printf("dp[%d]:{%d,%d,%d,%d}\n",u,dp[u][0],dp[u][1],dp[u][2],dp[u][3]); } int main() { freopen("traverse.in","r",stdin);freopen("traverse.out","w",stdout);//setvbuf(stdout,0,_IONBF,0); fac[0]=1;for(int i=1;i=2){rt=i;break;} dfs0(rt,0); for(int i=1;i<=k;++i) { int id;id=read(); if(fa[eu[id]]==ev[id])swap(eu[id],ev[id]); inK[ev[id]]=1; } dfs(rt,0); int ans=dp[rt][1]; for(int i=1;i<=n;++i)if(G[i].size()>=2)ans=1ll*ans*fac[G[i].size()-2]%p; write((ans%p+p)%p);pc(10); } flush(); fclose(stdin);fclose(stdout);return 0; }