#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5+10;
typedef long long LL;
LL ans;
struct node {
int u,v,d;
} a[MAXN];
int n,k,fa[MAXN];
bool enemys[MAXN];//enemys[i]==true 表示i城市被敌人占领
bool cmp(const node &x, const node &y) { return x.d > y.d; }
inline int find(int x){
if(fa[x]==x) return x;
return fa[x]=find(fa[x]);
}
int main() {
cin>>n>>k;
for(int i=0;i<k;i++) {
int x;
cin>>x;
enemys[x]=true;
}
for (int i = 0; i < n; i++) fa[i]=i;
for (int i = 1; i < n; i++) {
cin >> a[i].u >> a[i].v >> a[i].d;
ans+=a[i].d; //累计删除所有边的代价
}
sort(a + 1, a + n, cmp);
for (int i = 1; i < n; i++)
{
int u=a[i].u;
int v=a[i].v;
int d=a[i].d;
int fau=find(u),fav=find(v);
if (fau==fav) //存在连通uv的路径
ans-=d; //uv这条边就别删了
else if(!enemys[fau] || !enemys[fav]) //u城所在集合中没有敌人城市 或者 v城所在集合中没有敌人城市,那么uv边没必要删除
{
ans-=d;
if(enemys[fau]) fa[fav]=fau;//u城所在集合中有敌人城市,v并入u集合
else fa[fau]=fav; //u城所在集合中没有敌人城市,或者uv集合中都没有敌人城市,u并入v集合
}
}
cout << ans << endl;
return 0;
}