#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;
}