时间复杂度 O(logN)
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<vector>
#include<set>
#define LL long long
#define MOD 1000000007
using namespace std;
int N,M,A,B;
LL ans=0;
int dep[100005];
int p[100005][50];
LL bina[2000005];
int downcnt[100005],upcnt[100005];
int D[100005],U[100005];
struct Node
{
int v,kind;
};
vector<Node> map[100005];
inline void init()
{
memset(dep,0,sizeof(dep));
memset(p,-1,sizeof(p));
bina[0]=1;
for(int i=1;i<=2000000;i++)
bina[i]=(bina[i-1]*2)%MOD;
}
inline void dfs(int x,int fa)
{
int i;p[x][0]=fa;int next;
for(i=0;i<map[x].size();i++)
{
Node P=map[x][i];
next=P.v;
if(next==fa) continue;
dep[next]=dep[x]+1;
dfs(next,x);
}
}
inline void Pro()
{
int i,j;
for(j=1;(1<<j)<=N;j++)
for(i=1;i<=N;i++)
if(p[i][j-1]!=-1)
p[i][j]=p[p[i][j-1]][j-1];
}
inline int LCA(int a,int b)
{
int i,j;
if(dep[a]<dep[b]) swap(a,b);
for(i=0;(1<<i)<=dep[a];i++);
i--;
for(j=i;j>=0;j--)
{
if((dep[a]-(1<<j))>=dep[b])
a=p[a][j];
}
if(a==b) return a;
for(j=i;j>=0;j--)
{
if(p[a][j]!=-1&&p[a][j]!=p[b][j])
{
a=p[a][j];
b=p[b][j];
}
}
return p[a][0];
}
inline void solve(int x,int fa,int kind)
{
Node temp;int next,tmp;
for(int i=0;i<map[x].size();i++)
{
temp=map[x][i];
next=temp.v;
if(next==fa) continue;
solve(next,x,temp.kind);
D[x]+=D[next];
U[x]+=U[next];
}
D[x]+=downcnt[x];
U[x]+=upcnt[x];
if(kind==1)
{
ans+=(bina[U[x]]-1);
ans%=MOD;
}
if(kind==2)
{
ans+=(bina[D[x]]-1);
ans%=MOD;
}
}
int main()
{
init();Node temp;
int i,a,b,c;
scanf("%d",&N);
for(i=1;i<=N-1;i++)
{
scanf("%d%d%d",&a,&b,&c);
if(c==0)
{
temp.kind=c;temp.v=b;
map[a].push_back(temp);
temp.v=a;
map[b].push_back(temp);
}
else
{
temp.kind=1;temp.v=b;
map[a].push_back(temp);
temp.kind=2;temp.v=a;
map[b].push_back(temp);
}
}
dfs(1,-1);Pro();int cur,fa,last=1;
scanf("%d",&M);
for(i=1;i<=M;i++)
{
scanf("%d",&cur);
fa=LCA(cur,last);
upcnt[fa]--;upcnt[last]++;
downcnt[fa]--;downcnt[cur]++;
last=cur;
}
/* for(i=1;i<=N;i++)
cout<<i<<':'<<upcnt[i]<<' '<<downcnt[i]<<endl;*/
solve(1,-1,-1);
printf("%I64d\n",ans);
return 0;
}