#include <bits/stdc++.h>
namespace pb_ds {
namespace io {
const int MaxBuff = 1 << 15;
const int Output = 1 << 23;
char B[MaxBuff], *S = B, *T = B;
char Out[Output], *iter = Out;
inline void flush() {
  fwrite(Out, 1, iter - Out, stdout);
  iter = Out;
}
}  // namespace io
template <class Type>
inline Type Read() {
  using namespace io;
  register char ch;
  register Type ans = 0;
  register bool neg = 0;
  while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)
                   ? 0
                   : *S++),
         (ch < '0' || ch > '9') && ch != '-')
    ;
  ch == '-' ? neg = 1 : ans = ch - '0';
  while (ch = ((S == T) && (T = (S = B) + fread(B, 1, MaxBuff, stdin), S == T)
                   ? 0
                   : *S++),
         '0' <= ch && ch <= '9')
    ans = ans * 10 + ch - '0';
  return neg ? -ans : ans;
}
template <class Type>
inline void Print(register Type x, register char ch = '\n') {
  using namespace io;
  if (!x)
    *iter++ = '0';
  else {
    if (x < 0) *iter++ = '-', x = -x;
    static int s[100];
    register int t = 0;
    while (x) s[++t] = x % 10, x /= 10;
    while (t) *iter++ = '0' + s[t--];
  }
  *iter++ = ch;
}
}  // namespace pb_ds
using namespace pb_ds;
using namespace std;
const int N = 55;
const int inf = 2e9;
struct edge {
  int next, to;
} a[N << 1];
int head[N], cnt;
inline void add(int u, int v) {
  a[++cnt].to = v;
  a[cnt].next = head[u];
  head[u] = cnt;
}
int n, m, st, now, ans = inf;
int w[N][N], c[N], deg[N];
int dp[N][N][N][N], f[2][N];
void dfs(int x, int fa) {
  for (int i = head[x]; i; i = a[i].next) {
    int y = a[i].to;
    if (y == fa) continue;
    dfs(y, x), c[x] += c[y];
  }
}
int solve(int u, int v, int s1, int s2) {
  if (!s1) return s2 ? inf : 0;
  if (~dp[u][v][s1][s2]) return dp[u][v][s1][s2];
  if (deg[v] == 1) return dp[u][v][s1][s2] = (solve(v, u, s2, 0) + w[u][v]);
  for (int i = head[v]; i; i = a[i].next) {
    int y = a[i].to;
    if (y == u) continue;
    for (int j = 0; j <= s1; ++j) solve(v, y, j, s1 + s2 - j);
  }
  memset(f[0], 0, sizeof(f[0])), f[now = 0][0] = inf;
  for (int i = head[v]; i; i = a[i].next) {
    int y = a[i].to;
    if (y == u) continue;
    now ^= 1;
    memset(f[now], 0, sizeof(f[now]));
    for (int j = 0; j <= s1; ++j) {
      for (int k = 0; j + k <= s1; ++k) {
        f[now][j + k] =
            max(f[now][j + k], min(f[now ^ 1][j], solve(v, y, k, s1 + s2 - k)));
      }
    }
  }
  return (dp[u][v][s1][s2] = (f[now][s1] + w[u][v]));
}
int main() {
  n = Read<int>();
  for (int i = 1; i < n; ++i) {
    int u = Read<int>(), v = Read<int>();
    w[u][v] = w[v][u] = Read<int>();
    add(u, v), add(v, u);
    ++deg[u], ++deg[v];
  }
  st = Read<int>(), m = Read<int>();
  for (int i = 1; i <= m; ++i) ++c[Read<int>()];
  dfs(st, 0), memset(dp, -1, sizeof(dp));
  for (int i = head[st]; i; i = a[i].next)
    ans = min(ans, solve(st, a[i].to, c[a[i].to], m - c[a[i].to]));
  printf("%d\n", ans);
  return 0;
}
