#include #include using namespace std; using namespace atcoder; using ll = long long; using ld = long double; using mint = modint998244353; int N, M, H[101010]; vector G[101010]; int main() { cin >> N >> M; for (int i = 1; i <= N; i++) cin >> H[i]; for (int i = 1; i <= M; i++) { int x, y; cin >> x >> y; G[x].push_back(y); G[y].push_back(x); } ll INF = 1LL << 60; vector> dpc(N + 1, vector(2, -INF)); dpc[1][0] = 0; for (int a = 1; a <= N; a++) { for (auto b: G[a]) { if (a < b) { if (H[a] < H[b]) dpc[b][1] = max(dpc[b][1], dpc[a][0] + (H[b] - H[a])); else dpc[b][0] = max(dpc[b][0], max(dpc[a][0], dpc[a][1])); } } } vector> dpz(N + 1, vector(2, -INF)); dpz[N][0] = 0; for (int a = N; a >= 1; a--) { for (auto b: G[a]) { if (a > b) { if (H[a] < H[b]) dpz[b][1] = max(dpz[b][1], dpz[a][0] + (H[b] - H[a])); else dpz[b][0] = max(dpz[b][0], max(dpz[a][0], dpz[a][1])); } } } cout << (max(dpc[N][0], dpc[N][1]) > -INF / 2 ? max(dpc[N][0], dpc[N][1]): -1) << endl; cout << (max(dpz[1][0], dpz[1][1]) > -INF / 2 ? max(dpz[1][0], dpz[1][1]): -1) << endl; return 0; }