#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5, M = 5e5 + 5;
int n, m, u, v, fir[N][2], nxt[M][2], son[M][2], tot, f[N], g[N], idx, cnt, a[N], val[N], dfn[N], q[N], t, low[N], to[N], deg[N], h, ans, maxn, Max[N];
bool vis[N];
inline void add(int x, int y, int o){
nxt[++tot][o] = fir[x][o];
fir[x][o] = tot;
son[tot][o] = y;
}
inline void tarjan(int x){
q[++t] = x;
vis[x] = 1;
dfn[x] = low[x] = ++idx;
for(int i = fir[x][0]; i ; i = nxt[i][0]){
int v = son[i][0];
if(!dfn[v]){
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis[v]) low[x] = min(low[x], dfn[v]);
}
if(low[x] == dfn[x]){
cnt++;
while(vis[x]){
to[q[t]] = cnt;
val[cnt] += a[q[t]];
Max[cnt] = max(Max[cnt], a[q[t]]);
vis[q[t--]] = 0;
}
}
}
inline void topo(){
t = 0;
for(int i = 1; i <= cnt; i++){
if(!deg[i]) q[++t] = i;
f[i] = val[i];
g[i] = Max[i];
}
while(h < t){
h++;
u = q[h];
if(f[u] > ans){
ans = f[u];
maxn = g[u];
}
else if(f[u] == ans) maxn = max(maxn, g[u]);
for(int i = fir[u][1]; i ; i = nxt[i][1]){
v = son[i][1];
deg[v]--;
if(f[v] < f[u] + val[v]){
f[v] = f[u] + val[v];
g[v] = max(g[u], Max[v]);
}
else if(f[v] == f[u] + val[v]){
g[v] = max(g[u], g[v]);
}
if(deg[v] == 0) q[++t] = v;
}
}
}
int main(){
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
for(int i = 1; i <= m; i++){
scanf("%d%d", &u, &v);
add(u, v, 0);
}
for(int i = 1; i <= m; i++){
if(!dfn[i]) tarjan(i);
}
tot = 0;
for(int i = 1; i <= n; i++){
for(int j = fir[i][0]; j ; j = nxt[j][0]){
if(to[i] == to[son[j][0]]) continue ;
add(to[i], to[son[j][0]], 1);
deg[to[son[j][0]]]++;
}
}
topo();
printf("%d %d", ans, maxn);
return 0;
}