#include <bits/stdc++.h>
using namespace std;
int n, s, m, siz[55], deg[55];
int dp[55 << 1][55][55];
struct edge {
  int to, nxt, w;
  edge(){};
  edge(int a, int b, int c) {
    to = a;
    nxt = b;
    w = c;
  }
};
int tot = 1;
edge e[55 << 1];
int head[55];
void add(int u, int v, int w) {
  e[++tot] = edge(v, head[u], w);
  head[u] = tot;
  e[++tot] = edge(u, head[v], w);
  head[v] = tot;
}
void dfs(int u, int fa) {
  for (int i = head[u]; ~i; i = e[i].nxt) {
    int v = e[i].to;
    if (v == fa) continue;
    dfs(v, u);
    siz[u] += siz[v];
  }
}
int solve(int from, int in, int out) {
  int u = e[from].to;
  if (in == 0 && out == 0) return dp[from][in][out] = 0;
  if (~dp[from][in][out]) return dp[from][in][out];
  if (deg[u] == 1) {
    if (out == 0) return dp[from][in][out] = 0;
    return dp[from][in][out] = solve(from ^ 1, out, 0) + e[from].w;
  }
  int g[55];
  memset(g, 0, sizeof g);
  g[0] = 0x3f3f3f3f;
  for (int i = head[u]; ~i; i = e[i].nxt) {
    if (i == (from ^ 1)) continue;
    for (int j = in; j >= 1; j--)
      for (int k = 1; k <= j; k++) {
        g[j] = max(g[j], min(g[j - k], solve(i, k, in + out - k) + e[i].w));
      }
  }
  return dp[from][in][out] = g[in];
}
int main() {
  scanf("%d", &n);
  memset(head, -1, sizeof head);
  memset(dp, -1, sizeof dp);
  for (int i = 2; i <= n; i++) {
    int u, v, w;
    scanf("%d%d%d", &u, &v, &w);
    add(u, v, w);
    deg[u]++;
    deg[v]++;
  }
  scanf("%d%d", &s, &m);
  for (int i = 1; i <= m; i++) {
    int u;
    scanf("%d", &u);
    siz[u]++;
  }
  dfs(s, 0);
  int ans = 0x3f3f3f3f;
  for (int i = head[s]; ~i; i = e[i].nxt) {
    int v = e[i].to;
    ans = min(ans, solve(i, siz[v], m - siz[v]) + e[i].w);
  }
  printf("%d\n", ans);
  return 0;
}
