#include<bits/stdc++.h>
using namespace std;
const long long inf=100000000000;
long long n,m,k,mid,a[805],dep[805],mn[805],s[805],f[805][25],dp[805][805];
bool leaf[805];
vector<long long>v[805];
long long ss(long long x,long long fa)
{
f[x][0]=fa;
for(long long i=1;f[x][i-1];i++)
{
f[x][i]=f[f[x][i-1]][i-1];
}
dep[x]=dep[fa]+1;
bool ff=true;
for(auto y:v[x])
{
if(y==fa)continue;
ff=false;
ss(y,x);
}
leaf[x]=ff;
}
long long getlca(long long x,long long y)
{
if(dep[x]<dep[y])swap(x,y);
for(long long i=10;i>=1;i--)
{
if(dep[x]-(1<<i)>=dep[y])
{
x=f[x][i];
}
}
if(x==y)return x;
for(long long i=10;i>=1;i--)
{
if(f[x][i]!=f[y][i])
{
x=f[x][i];
y=f[y][i];
}
}
return f[x][0];
}
void tt(long long x,long long fa)
{
for(auto y:v[x])
{
if(y==fa)continue;
tt(y,x);
s[x]+=s[y];
}
}
void solve(long long dep,long long x,long long fa)
{
mn[x]=inf;
for(auto y:v[x])
{
if(y==fa)continue;
solve(dep+1,y,x);
}
for(long long i=1;i<=n;i++)
{
dp[x][i]=0;
if(leaf[x])
{
if(a[x]>=a[i]&&a[x]<=a[i]+mid)
{
dp[x][i]=0;
mn[x]=0;
}
else dp[x][i]=inf;
continue;
}
if(a[x]<a[i]||a[x]>a[i]+mid)
{
dp[x][i]=inf;
continue;
}
for(auto y:v[x])
{
if(y==fa)continue;
dp[x][i]=dp[x][i]+min(s[y]+mn[y],dp[y][i]);
}
mn[x]=min(mn[x],dp[x][i]);
}
}
void read(long long &s)
{
s=0;
char c=getchar();
while(!isdigit(c))c=getchar();
while(isdigit(c))
{
s=(s<<3)+(s<<1)+(c^48);
c=getchar();
}
}
void write(long long x)
{
if(!x)return;
write(x/10);
putchar(x%10+48);
}
int main()
{
read(n);read(m);read(k);
for(long long i=1;i<=n;i++)read(a[i]);
for(long long i=1;i<n;i++)
{
long long x,y;
read(x);read(y);
v[x].push_back(y);
v[y].push_back(x);
}
ss(1,0);
for(long long i=1;i<=m;i++)
{
long long x,y;
cin>>x>>y;
long long lca=getlca(x,y);
s[lca]-=2;
s[x]++;
s[y]++;
}
tt(1,0);
long long l=0,r=1e9;
while(l<r)
{
mid=(l+r)/2;
solve(0,1,0);
if(mn[1]<=k)r=mid;
else l=mid+1;
}
if(!l)puts("0");
else write(l);
putchar(10);
return 0;
}