#include <bits/stdc++.h>
using namespace std;
int n, m;
int f[51][51];
struct Edge {
  int v, c, nxt;
} e[110];
int tot;
int first[51], deg[51];
void build(int u, int v, int c) {
  e[++tot] = (Edge){v, c, first[u]};
  first[u] = tot;
  deg[u]++;
  return;
}
int dis[51][51];
int a[51], k;
void dfs(int u, int lst, int s) {
  for (int i = first[u]; i; i = e[i].nxt)
    if (e[i].v != lst) {
      dis[s][e[i].v] = dis[s][u] + e[i].c;
      dfs(e[i].v, u, s);
    }
  return;
}
bool check(int s, int cnt, int lim) {
  int num = 0;
  for (int i = 1; i <= k; i++) {
    int j = 1;
    while (j <= cnt && f[a[i]][cnt - j] + dis[s][a[i]] >= lim) j++;
    num += j - 1;
  }
  if (num >= cnt) return true;
  return false;
}
int solve(int s, int cnt) {
  if (cnt == 0) return 0;
  int l = 0, r = n * cnt * 50 + 1;
  while (l + 1 < r) {
    int mid = (l + r) >> 1;
    if (check(s, cnt, mid))
      l = mid;
    else
      r = mid;
  }
  return l;
}
int siz[51];
void gettree(int u, int lst, vector<int>& vec) {
  if (deg[u] == 1) vec.push_back(u);
  for (int i = first[u]; i; i = e[i].nxt)
    if (e[i].v != lst) {
      gettree(e[i].v, u, vec);
      siz[u] += siz[e[i].v];
    }
  return;
}
int Solve(int s, int cnt, vector<int> vec) {
  int l = 0, r = n * m * 50 + 1;
  while (l + 1 < r) {
    int mid = (l + r) >> 1;
    int num = 0;
    for (int i = 0; i < vec.size(); i++) {
      int u = vec[i];
      int j = 1;
      while (j <= cnt && f[u][m - j] + dis[s][u] >= mid) j++;
      num += j - 1;
    }
    if (num >= cnt)
      l = mid;
    else
      r = mid;
  }
  return l;
}
vector<int> V;
int main() {
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int u, v, c;
    scanf("%d %d %d", &u, &v, &c);
    build(u, v, c);
    build(v, u, c);
  }
  int s;
  scanf("%d", &s);
  scanf("%d", &m);
  for (int i = 1; i <= m; i++) {
    int u;
    scanf("%d", &u);
    siz[u]++;
  }
  for (int i = 1; i <= n; i++)
    if (deg[i] == 1) a[++k] = i;
  for (int i = 1; i <= n; i++) dfs(i, 0, i);
  for (int i = 0; i <= m; i++)
    for (int j = 1; j <= k; j++) f[a[j]][i] = solve(a[j], i);
  int ans = 1e9;
  for (int i = first[s]; i; i = e[i].nxt) {
    int v = e[i].v;
    V.clear();
    gettree(v, s, V);
    ans = min(ans, Solve(s, siz[v], V));
  }
  printf("%d\n", ans);
  return 0;
}
