RT
#include<bits/stdc++.h>
using namespace std;
template<class T>void read(T &x){
x=0;
T f=1;
char ch=getchar();
while(ch<'0'||'9'<ch){
if(ch=='-'){
f=-1;
}
ch=getchar();
}
while('0'<=ch&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
x=x*f;
return;
}
template<class T,class ...Arg>void read(T &x,Arg &...arg){
read(x);
read(arg...);
return;
}
template<class T>void write(T x){
if(x<0){
putchar('-');
x=-x;
}
if(x<10){
putchar(x+48);
}
else{
write(x/10);
putchar(x%10+48);
}
return;
}
void f(string a){
freopen((a+".in").c_str(),"r",stdin);
freopen((a+".out").c_str(),"w",stdout);
return;
}
const int maxn=2505;
int n,m,k;
int h[maxn];
int ans;
vector<int> nbr[maxn];
int dp[maxn];
vector<int>jian[maxn];
bool g[maxn][maxn];
int lb(int j,int x){
int l=-1,r=jian[j].size();
while(l+1<r){
int mid=(l+r)>>1;
if(jian[j][mid]<=x){
l=mid;
}
else{
r=mid;
}
}
return max(l,0);
}
int ub(int j,int x){
int l=-1,r=jian[j].size();
while(l+1<r){
int mid=(l+r)>>1;
if(jian[j][mid]>=x){
r=mid;
}
else{
l=mid;
}
}
return min(r,(int)jian[j].size()-1);
}
int main(){
read(n,m,k);
for(int i=2;i<=n;i++)read(h[i]);
for(int i=1;i<=m;i++){
int u,v;
read(u,v);
nbr[u].push_back(v);
nbr[v].push_back(u);
g[u][v]=g[v][u]=1;
}
// if(k==0){
for(int i=0;i<nbr[1].size();i++){
int nxt1=nbr[1][i];
for(int j=0;j<nbr[nxt1].size();j++){
int nxt2=nbr[nxt1][j];
if(nxt2==1)continue;
// printf("nxt1=%d nxt2=%d\n",nxt1,nxt2);
if(h[nxt2]+h[nxt1]>dp[nxt2]){
dp[nxt2]=h[nxt1]+h[nxt2];
jian[nxt2].clear();
}
if(dp[nxt2]==h[nxt1]+h[nxt2]){
jian[nxt2].push_back(nxt1);
}
}
}
for(int i=2;i<=n;i++){
if(jian[i].size()==0)continue;
for(int j=i+1;j<=n;j++){
if(!g[i][j]||jian[j].size()==0)continue;
if(jian[i].size()==1){
if(jian[j].size()==1&&jian[i][0]==jian[j][0])continue;
if(jian[i][0]==j||jian[j][0]==i&&jian[j].size()==1)continue;
ans=max(ans,dp[i]+dp[j]);
}
}
}
cout<<ans<<endl;
// }
// else{
//
// }
return 0;
}