#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<(n);i++)

using namespace std;
using lint=long long;

using graph=vector<vector<int>>;

void add_directed_edge(graph& G,int u,int v){
	G[u].emplace_back(v);
}

const long long INF=1LL<<61;

int main(){
	int n,m; scanf("%d%d",&n,&m);
	vector<lint> a(n);
	rep(i,n) scanf("%lld",&a[i]);

	graph G(n);
	rep(i,m){
		int u,v; scanf("%d%d",&u,&v); u--; v--;
		add_directed_edge(G,u,v);
	}

	vector<lint> dp(n,INF);
	rep(u,n) for(int v:G[u]) {
		dp[v]=min({dp[v],dp[u],a[u]});
	}

	lint ans=-INF;
	rep(u,n) ans=max(ans,a[u]-dp[u]);
	printf("%lld\n",ans);

	return 0;
}

#include<bits/stdc++.h>
using namespace std;
#define N 5005
#define mod 998244353
#define ll long long
int n,m,c[N][N],f[21][N];
int main(){
	for(int i=0;i<N;i++){
		c[i][0]=c[i][i]=1;
		for(int j=1;j<i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
	}
	scanf("%d%d",&n,&m);
	f[0][0]=1;
	int lst=0;
	for(int i=1;(1<<i)<=m;i++){
		for(int j=0;(2*j<=n)&&(j*(1<<i)<=m);j++)
			for(int k=j*(1<<i);k<=m;k++)f[i][k]=(f[i][k]+1LL*c[n][2*j]*f[i-1][k-j*(1<<i)])%mod;
		lst=i;
	}
	printf("%d",f[lst][m]);
}