#include <bits/stdc++.h>
using namespace std;
const int maxn = 50 + 5;
const int INF = 1 << 30;
int dfs(int, int, int);
struct edge {
  int to, w, next;
  edge(int to = 0, int w = 0, int next = 0) : to(to), w(w), next(next) {}
} G[maxn << 1];
int dp[maxn << 1][maxn][maxn], head[maxn], tot, deg[maxn], sz[maxn];
void init() {
  memset(head, -1, sizeof(head));
  memset(dp, -1, sizeof(dp));
  memset(deg, 0, sizeof(deg));
  tot = 0;
}
void addedge(int u, int v, int w) {
  G[tot] = edge(v, w, head[u]);
  head[u] = tot++;
  G[tot] = edge(u, w, head[v]);
  head[v] = tot++;
  ++deg[u], ++deg[v];
}
void get_sz(int u, int fa) {
  for (int i = head[u]; ~i; i = G[i].next) {
    int v = G[i].to;
    if (v == fa) continue;
    get_sz(v, u);
    sz[u] += sz[v];
  }
}
int check(int u, int e, int t, int r, int m) {
  long long f = 1;
  for (int i = head[u]; ~i; i = G[i].next) {
    if ((i ^ e) == 1) continue;
    long long g = f;
    for (int j = 1; j <= r; ++j)
      if (dfs(i, t, j) > m) f |= g << j;
  }
  return !(f >> r & 1);
}
int dfs(int e, int t, int r) {
  if (~dp[e][t][r]) return dp[e][t][r];
  int &ret = dp[e][t][r];
  if (t == 0) return ret = G[e].w;
  ret = INF;
  int u = G[e].to;
  if (deg[u] == 1) return ret = (r < t ? dfs(e ^ 1, t - r, t - r) : 0) + G[e].w;
  int lb = 0, ub = INF;
  while (lb < ub) {
    int m = (lb + ub) >> 1;
    if (check(u, e, t, r, m))
      ub = m;
    else
      lb = m + 1;
  }
  ret = lb + G[e].w;
  return ret;
}
int main() {
  init();
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    addedge(u, v, w);
  }
  int s, m;
  scanf("%d%d", &s, &m);
  for (int i = 1; i <= m; ++i) {
    int u;
    scanf("%d", &u);
    ++sz[u];
  }
  get_sz(s, 0);
  int ans = INF;
  for (int i = head[s]; ~i; i = G[i].next)
    ans = min(ans, dfs(i, m, sz[G[i].to]));
  printf("%d\n", ans);
  return 0;
}
