#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,rd[100005],h[100005],cnt;
double dp[100005][2],f[100005][2],k,ans;
bool fla[100005];
vector<int> v[100005];
void top_sort(){
queue<int> q;
for(int i=1;i<=n;i++){
if(rd[i]==1){
q.push(i);
}
}
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=0;i<(int)v[x].size();i++){
int y=v[x][i];
rd[y]--;
if(rd[y]==1){
q.push(y);
}
}
}
for(int i=1;i<=n;i++){
if(rd[i]==2){
h[++cnt]=i;
break;
}
}
}
void dfs(int x,int fa){
for(int i=0;i<(int)v[x].size();i++){
int y=v[x][i];
if(y!=fa&&!fla[y]&&rd[y]==2){
h[++cnt]=y;
fla[y]=1;
dfs(y,x);
break;
}
}
}
void dfs_dp(int x,int fa){
for(int i=0;i<(int)v[x].size();i++){
int y=v[x][i];
if(y!=fa&&!fla[y]){
dfs(y,x);
dp[x][0]+=max(dp[y][0],dp[y][1]);
dp[x][1]+=dp[y][0];
}
}
}
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>dp[i][1];
}
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
x++;
y++;
v[x].push_back(y);
v[y].push_back(x);
rd[x]++;
rd[y]++;
}
cin>>k;
top_sort();
fla[h[1]]=1;
dfs(h[1],-1);
for(int i=1;i<=cnt;i++){
dfs_dp(h[i],-1);
}
f[1][0]=dp[h[1]][0];
for(int i=2;i<=cnt;i++){
f[i][0]=max(f[i-1][0],f[i-1][1])+dp[h[i]][0];
f[i][1]=f[i-1][0]+dp[h[i]][1];
}
ans=max(f[cnt][0],f[cnt][1]);
memset(f,0,sizeof(f));
f[1][1]=dp[h[1]][1];
for(int i=2;i<=cnt;i++){
f[i][0]=max(f[i-1][0],f[i-1][1])+dp[h[i]][0];
f[i][1]=f[i-1][0]+dp[h[i]][1];
}
ans=max(ans,f[cnt][0]);
ans*=k;
cout<<fixed<<setprecision(1)<<ans;
return 0;
}