#include <bits/stdc++.h>
using namespace std;
const int maxn = 55;
const int INF = 1E9 + 77;
struct EDGE {
  int to, w, next;
} edges[maxn * 2];
int cEdge = 1, head[maxn], ce[maxn], D[maxn][maxn];
void addEdge(int from, int to, int w) {
  edges[cEdge] = (EDGE){to, w, head[from]};
  head[from] = cEdge++;
}
int N, S, M, size[maxn];
void dfs(int u, int f) {
  for (int k = head[u]; k; k = edges[k].next) {
    int v = edges[k].to, w = edges[k].w;
    if (v == f) continue;
    dfs(v, u);
    size[u] += size[v];
  }
}
int C[maxn][maxn][maxn][maxn];
int DP(int u, int v, int tot, int frt) {
  if (C[u][v][tot][frt]) return C[u][v][tot][frt];
  int &ret = C[u][v][tot][frt];
  int dp[maxn];
  if (tot == 0) {
    return ret = 0;
  }
  if (frt == 0) {
    return ret = INF;
  }
  if (ce[v] == 1) {
    if (tot == frt) {
      return 0;
    }
    ret = DP(v, u, tot - frt, tot - frt) + D[v][u];
    return ret;
  }
  dp[0] = INF;
  for (int i = 1; i <= frt; ++i) dp[i] = -INF;
  for (int k = head[v]; k; k = edges[k].next) {
    int v2 = edges[k].to, w = edges[k].w;
    if (v2 == u) continue;
    for (int j = frt; j >= 0; --j) {
      for (int k = 0; k <= j; ++k) {
        int val = min(dp[j - k], w + DP(v, v2, tot, k));
        if (val > dp[j]) dp[j] = val;
      }
    }
  }
  ret = dp[frt];
  return ret;
}
int main() {
  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);
    addEdge(v, u, w);
    ++ce[u];
    ++ce[v];
    D[u][v] = D[v][u] = w;
  }
  scanf("%d%d", &S, &M);
  for (int i = 0; i < M; ++i) {
    int x;
    scanf("%d", &x);
    ++size[x];
  }
  dfs(S, 0);
  int ans = INF;
  for (int k = head[S]; k; k = edges[k].next) {
    int v = edges[k].to, w = edges[k].w;
    ans = min(ans, DP(S, v, M, size[v]) + w);
  }
  printf("%d\n", ans);
}
