#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
const int N = 55;
int n, cnt[N];
vector<pair<int, int> > adj[N];
void dfs(int u, int p, int depth, vector<pair<int, int> > &leaves) {
  bool leaf = 1;
  for (auto e : adj[u]) {
    int v, c;
    tie(v, c) = e;
    if (v == p) continue;
    dfs(v, u, depth + c, leaves);
    leaf = 0;
  }
  if (leaf) leaves.emplace_back(u, depth);
}
int dp[N][N], best[N][N];
int go(int root, int pre, int total, int put) {
  vector<pair<int, int> > leaves;
  dfs(root, pre, 0, leaves);
  int sz = ((int)(leaves).size());
  for (int from = (int)(sz + 1) - 1; from >= ((int)0); from--) {
    for (int left = (int)(0); left < ((int)put + 1); left++) {
      if (from == sz) {
        best[from][left] = (left ? -INF : INF);
      } else {
        best[from][left] = best[from + 1][left];
        int l = leaves[from].first, cost = leaves[from].second;
        for (int pick = 1; pick <= left; pick++) {
          best[from][left] =
              max(best[from][left],
                  min(cost + dp[l][total - pick], best[from + 1][left - pick]));
        }
      }
    }
  }
  return best[0][put];
}
void dfsSize(int u, int p) {
  for (auto e : adj[u]) {
    int v, c;
    tie(v, c) = e;
    if (v == p) continue;
    dfsSize(v, u);
    cnt[u] += cnt[v];
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  for (int _ = 0; _ < (int)(n - 1); _++) {
    int u, v, c;
    cin >> u >> v >> c;
    u--;
    v--;
    adj[u].emplace_back(v, c);
    adj[v].emplace_back(u, c);
  }
  int s;
  cin >> s;
  s--;
  int m;
  cin >> m;
  for (int _ = 0; _ < (int)(m); _++) {
    int u;
    cin >> u;
    cnt[u - 1]++;
  }
  for (int total = 1; total <= m; total++) {
    for (int u = 0; u < (int)(n); u++) {
      dp[u][total] = go(u, u, total, total);
    }
  }
  dfsSize(s, -1);
  int ans = INF;
  for (auto e : adj[s]) {
    int v, c;
    tie(v, c) = e;
    ans = min(ans, c + go(v, s, m, cnt[v]));
  }
  cout << ans << endl;
  return 0;
}
