#include <bits/stdc++.h>
using namespace std;
int n, r1, r2, c, s;
long long t;
bitset<100010> used;
vector<vector<int>> tree;
vector<pair<int, long long>> in;
long long min(const long long &a, const long long &b) {
  return (a < b ? a : b);
}
bool comp(const int &a, const int &b) {
  return (in[a].second > in[b].second ? 1 : 0);
}
void dfs(const int &v) {
  used[v] = 1;
  vector<int> usd;
  for (int i : tree[v])
    if (!used[i]) {
      usd.push_back(i);
      dfs(i);
    }
  if (usd.size() && in[v].first > 1) {
    sort(usd.begin(), usd.end(), comp);
    --in[v].first;
    ++in[v].second;
    for (int i : usd) {
      if (in[v].first && in[i].second) {
        in[v].second += in[i].second;
        --in[v].first;
        ++in[v].second;
      } else
        break;
    }
    for (int i : usd) {
      if (in[v].first) {
        t = min(in[v].first, in[i].first);
        in[v].second += (t << 1);
        in[v].first -= t;
      } else
        break;
    }
  }
}
void dfsstart() {
  used[s] = 1;
  vector<int> usd;
  for (int i : tree[s]) {
    usd.push_back(i);
    dfs(i);
  }
  sort(usd.begin(), usd.end(), comp);
  for (int i : usd) {
    if (in[s].first && in[i].second) {
      in[s].second += in[i].second;
      --in[s].first;
      ++in[s].second;
    } else
      break;
  }
  for (int i : usd) {
    if (in[s].first) {
      t = min(in[s].first, in[i].first);
      in[s].second += (t << 1);
      in[s].first -= t;
    } else
      break;
  }
}
int main() {
  scanf("%d", &n);
  tree.resize(n + 1);
  in.resize(n + 1);
  for (c = 1; c <= n; ++c) {
    scanf("%d", &r1);
    in[c].first = r1;
  }
  for (c = 1; c < n; ++c) {
    scanf("%d%d", &r1, &r2);
    tree[r1].push_back(r2);
    tree[r2].push_back(r1);
  }
  scanf("%d", &s);
  dfsstart();
  printf("%I64d", in[s].second);
}
