#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;
using ll = long long;
const int MAXN = 5e4 + 5;
struct Edge {
int u, w;
};
bool v[MAXN];
vector<Edge> g[MAXN];
vector<ll> a[MAXN];
int n, m, k, xx[MAXN], b[MAXN], fa[MAXN][16];
ll st[MAXN][16];
void dfs(int x, int fx) {
for (int i = 1; i < 16; i++) {
fa[x][i] = fa[fa[x][i - 1]][i - 1];
st[x][i] = st[x][i - 1] + st[fa[x][i - 1]][i - 1];
}
for (auto e : g[x]) {
if (e.u != fx) {
fa[e.u][0] = x, st[e.u][0] = e.w;
dfs(e.u, x);
}
}
}
bool Dfs(int x, int fx) {
if (v[x]) return 1;
if (g[x].size() == 1) {
return 0;
}
bool flag = 1;
for (auto e : g[x]) {
if (e.u != fx) flag &= Dfs(e.u, x);
}
return flag;
}
bool Check(ll ti) {
for (int i = 1; i <= n; i++) {
v[i] = 0, a[i].clear();
}
for (int i = 1; i <= m; i++) {
int u = xx[i];
ll t = ti;
for (int j = 15; j >= 0; j--) {
if (st[u][j] <= t && fa[u][j] > 1) {
t -= st[u][j], u = fa[u][j];
}
}
if (fa[u][0] == 1 && st[u][0] <= ti) {
a[u].push_back(t);
} else {
v[u] = 1;
}
}
vector<pair<ll, int>> p;
multiset<pair<ll, int>> q;
for (int i = 1; i <= k; i++) {
if (Dfs(b[i], 1)) continue;
p.push_back({st[b[i]][0], b[i]});
}
for (int i = 1; i <= k; i++) {
for (auto t : a[b[i]]) {
q.insert({t - st[b[i]][0], b[i]});
}
}
for (auto [t, x] : p) {
auto it = q.lower_bound({t, 0});
ll tt = 1e14;
for (auto o : a[x]) {
if (q.find({o - t , x}) != q.end()) {
tt = min(o - t, tt);
}
}
if (it == q.end() && tt == 1e14) return 0;
if (it == q.end() || tt + 2 * t <= it->first) {
q.erase(q.find({tt, x}));
} else {
q.erase(it);
}
}
return 1;
}
int main() {
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1, u, v, w; i < n; i++) {
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
for (auto e : g[1]) {
b[++k] = e.u;
}
cin >> m, dfs(1, 0);
for (int i = 1; i <= m; i++) {
cin >> xx[i];
}
ll l = 1, r = 1e14;
while (l < r) {
ll mid = (l + r) >> 1;
Check(mid) ? r = mid : l = mid + 1;
}
cout << (l == 1e14 ? -1ll : l);
return 0;
}