#include<bits/stdc++.h>
using namespace std;
struct node
{
int to , nxt , w;
}e[400010];
struct edge
{
int u , dis;
bool operator < (const edge qwq) const
{
return dis > qwq.dis;
}
};
priority_queue<edge> q;
int tot , head[400010] , h[200010] , dis[200010];
bool vis[200010];
int n , m;
void add(int u , int v , int w)
{
++ tot;
e[tot].to = v;
e[tot].nxt = head[u];
e[tot].w = w;
head[u] = tot;
}
void dijk(int s)
{
dis[s] = 0;
q.push({s , dis[s]});
while(!q.empty())
{
edge tmp = q.top();
q.pop();
int u = tmp.u;
if(!vis[u]) continue;
vis[u] = true;
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
int w = e[i].w;
if(dis[v] < dis[u] + w)
{
dis[v] = dis[u] + w;
q.push({v , dis[v]});
}
}
}
}
int main()
{
scanf("%d%d" , &n , &m);
for(int i = 1 ; i <= n ; i ++) scanf("%d" , &h[i]);
for(int i = 1 ; i <= m ; i ++)
{
int u , v;
scanf("%d%d" , &u , &v);
add(u , v , (h[u] >= h[v]) ? 0 : (h[u] - h[v]));
add(v , u , (h[v] >= h[u]) ? 0 : (h[v] - h[u]));
}
dijk(1);
int ans = INT_MIN;
for(int i = 1 ; i <= n ; i ++) ans = max(ans , dis[i] + h[i] - h[1]);
printf("%d" , ans);
return 0;
}