#include <bits/stdc++.h>
using namespace std;
int n, first[59], number, st, tg[59], m, fa[59], d[59], f[59][59];
int DP[59][59][59][59], Ans = 0x3f3f3f3f;
struct edge {
  int to, next, val;
  void add(int x, int y, int z) {
    to = y, next = first[x], first[x] = number, val = z;
  }
} e[59 << 1];
int read() {
  int x = 1;
  char ch;
  while (ch = getchar(), ch < '0' || ch > '9')
    if (ch == '-') x = -1;
  int s = ch - '0';
  while (ch = getchar(), ch >= '0' && ch <= '9') s = s * 10 + ch - '0';
  return x * s;
}
int dp(int x, int y, int z, int w) {
  if (z == 0 && w == 0) return 0;
  if (DP[x][y][z][w]) return DP[x][y][z][w];
  if (d[x] == 1) {
    if (z == 0) return 0;
    return DP[x][y][z][w] = dp(y, x, 0, z) + f[x][y];
  }
  int g[59];
  for (int i = 1; i <= w; i++) g[i] = -0x3f3f3f3f;
  g[0] = 0x3f3f3f3f;
  for (int i = first[x]; i; i = e[i].next)
    if (e[i].to != y) {
      for (int j = w; j; j--)
        for (int k = 1; k <= j; k++)
          g[j] =
              max(g[j], min(g[j - k], dp(e[i].to, x, z + w - k, k) + e[i].val));
    }
  return DP[x][y][z][w] = g[w];
}
void dfs(int x) {
  for (int i = first[x]; i; i = e[i].next)
    if (e[i].to != fa[x]) {
      fa[e[i].to] = x, dfs(e[i].to);
      tg[x] += tg[e[i].to];
    }
}
int main() {
  n = read();
  for (int i = 1; i < n; i++) {
    int x = read(), y = read(), z = read();
    e[++number].add(x, y, z);
    e[++number].add(y, x, z);
    d[x]++, d[y]++;
    f[x][y] = f[y][x] = z;
  }
  st = read(), m = read();
  for (int i = 1; i <= m; i++) tg[read()]++;
  dfs(1);
  for (int i = first[st]; i; i = e[i].next)
    if (e[i].to == fa[st])
      Ans = min(Ans, dp(e[i].to, st, tg[st], m - tg[st]) + e[i].val);
    else
      Ans = min(Ans, dp(e[i].to, st, m - tg[e[i].to], tg[e[i].to]) + e[i].val);
  printf("%d\n", Ans);
  return 0;
}
