#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const long long mod = 1000000007;
int n;
vector<pair<int, int> > g[55];
int dist[55][55];
void build() {
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
}
int haramya[55];
int com[55], t;
int dp[55];
vector<int> leafs;
vector<int> fareed;
int dfs(int node, int par) {
  int& ret = dp[node];
  ret = haramya[node];
  bool leaf = 1;
  for (int i = 0; i < g[node].size(); i++) {
    int u = g[node][i].first;
    if (u == par) continue;
    leaf = 0;
    ret += dfs(u, node);
  }
  if (leaf) leafs.push_back(node);
  return ret;
}
void dfs2(int node, int par, int val) {
  dp[node] = val;
  com[node] = t;
  for (int i = 0; i < g[node].size(); i++) {
    int u = g[node][i].first;
    if (u == par) continue;
    dfs2(u, node, val);
  }
}
const int mxN = 55;
int dpvri[mxN][mxN][mxN][mxN];
int dpvr[mxN][mxN];
int dps[mxN][mxN];
void solvevri(int s) {
  int har = dp[s];
  for (int R = 1; R <= har; R++) {
    for (int v = 1; v <= n; v++) {
      for (int i = 0; i < (int)fareed.size(); i++) {
        for (int X = 0; X <= R; X++) {
          dpvri[R][v][i][X] = 0;
          for (int xi = (i == 0 ? X : 0); xi <= X; xi++) {
            dpvri[R][v][i][X] = max(
                dpvri[R][v][i][X],
                min((xi == 0 ? INT_MAX
                             : dist[v][fareed[i]] + dpvr[R - xi][fareed[i]]),
                    (i ? dpvri[R][v][i - 1][X - xi] : INT_MAX)));
          }
        }
      }
      dpvr[R][v] = dpvri[R][v][(int)fareed.size() - 1][R];
    }
  }
}
int solve(int s) {
  int har = dp[s];
  for (int i = 0; i < (int)leafs.size(); i++) {
    for (int X = 0; X <= dp[leafs[i]]; X++) {
      dps[i][X] = 0;
      bool fs = com[leafs[i]] != (i ? com[leafs[i - 1]] : -1);
      for (int xi = (fs ? X : 0); xi <= X; xi++) {
        int pre = fs ? (i ? dp[leafs[i - 1]] : 0) : X - xi;
        dps[i][X] =
            max(dps[i][X], min(dist[s][leafs[i]] + dpvr[har - xi][leafs[i]],
                               (i ? dps[i - 1][pre] : INT_MAX)));
      }
    }
  }
  return dps[leafs.size() - 1][dp[leafs.back()]];
}
int main(int argc, char** argv) {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  cin >> n;
  if (n == 1) {
    cout << "0\n";
    return 0;
  }
  for (int i = 0; i <= n; i++)
    for (int j = 0; j <= n; j++) dist[i][j] = 1e8, dist[i][i] = 0;
  for (int i = 1, u, v, w; i < n; i++) {
    cin >> u >> v >> w;
    g[u].push_back({v, w});
    dist[u][v] = w;
    dist[v][u] = w;
    g[v].push_back({u, w});
  }
  build();
  int s;
  cin >> s;
  int m;
  cin >> m;
  for (int i = 0, a; i < m; i++) {
    cin >> a;
    haramya[a]++;
  }
  dfs(s, s);
  fareed = leafs;
  if (g[s].size() == 1) fareed.push_back(s);
  for (int i = 0; i < g[s].size(); i++) {
    int v = g[s][i].first;
    t++;
    dfs2(v, s, dp[v]);
  }
  solvevri(s);
  cout << solve(s) << '\n';
  return 0;
}
