#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,deg[N],a[N],f[N][2],root,special,cnt;
double K,sum;
int tot,head[N],ver[N<<1],nxt[N<<1];
queue<int>q;
bool ring[N],vis[N];
int read(){
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-')f=-1;
ch=getchar();
}
while(isdigit(ch)){
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void add(int x,int y){
nxt[++tot]=head[x];
head[x]=tot;
ver[tot]=y;
}
void dfs(int x,int fa){
f[x][1]=a[x];
f[x][0]=0;
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
if(y!=fa&&(!((x==root&&y==special)||(x==special&&y==root)))){
dfs(y,x);
f[x][1]+=f[y][0];
f[x][0]+=max(f[y][0],f[y][1]);
}
}
}
signed main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++){
int x=read()+1,y=read()+1;
add(x,y);
add(y,x);
deg[x]++;
deg[y]++;
}
scanf("%lf",&K);
for(int i=1;i<=n;i++){
ring[i]=1;
if(deg[i]==1)q.push(i);
}
while(q.size()){
int x=q.front();
ring[x]=0;
q.pop();
for(int i=head[x];i;i=nxt[i]){
int y=ver[i];
deg[y]--;
if(deg[y]==1)q.push(y);
}
}
memset(deg,0,sizeof deg);
int tmp=0;
for(int i=1;i<=n;i++)tmp+=ring[i];
if(tmp==2||tmp==1){
dfs(1,0);
printf("%.1lf",1.0*K*max(f[1][1],f[1][0]));
return 0;
}
for(int i=1;i<=n;i++){
if(ring[i]){
root=i;
special=ver[head[i]];
dfs(root,special);
sum=f[root][0];
memset(f,0,sizeof f);
dfs(special,root);
sum=max(sum,(double)f[special][0]);
printf("%.1f",sum*K);
return 0;
}
}
return 0;
}