#include <bits/stdc++.h>
using namespace std;
using int64 = long long;
const int64 NEG = -(1LL<<60);
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
if (!(cin >> n >> m)) return 0;
vector<int64> c(n);
for (int i = 0; i < n; ++i) cin >> c[i];
// adjacency on full graph (n <= 64 is safe with 64-bit mask)
vector<unsigned long long> adj(n, 0);
for (int i = 0, u, v; i < m; ++i) {
cin >> u >> v; --u; --v;
adj[u] |= (1ULL << v);
adj[v] |= (1ULL << u);
}
int n1 = n / 2;
int n2 = n - n1;
// masks limited to their halves
const unsigned long long FULLA64 = (n1 == 64 ? ~0ULL : ((1ULL << n1) - 1ULL));
const unsigned long long FULLB64 = (n2 == 64 ? ~0ULL : ((1ULL << n2) - 1ULL));
// Data for A
vector<int64> wA(n1);
vector<unsigned int> inA(n1, 0); // adjacency inside A (n1 bits)
for (int i = 0; i < n1; ++i) {
wA[i] = c[i];
inA[i] = (unsigned int)(adj[i] & FULLA64);
}
// Data for B
vector<int64> wB(n2);
vector<unsigned int> inB(n2, 0); // adjacency inside B (n2 bits)
vector<unsigned int> crossBA(n2, 0); // from B vertex -> forbidden A bits
for (int j = 0; j < n2; ++j) {
int v = n1 + j;
wB[j] = c[v];
inB[j] = (unsigned int)((adj[v] >> n1) & FULLB64);
crossBA[j] = (unsigned int)(adj[v] & FULLA64);
}
// DP on side A for independent sets, then SOS to get bestA[allowMask]
int sizeA = 1 << n1;
vector<int64> dpA(sizeA, NEG);
dpA[0] = 0;
for (int mask = 1; mask < sizeA; ++mask) {
int u = __builtin_ctz(mask);
int pm = mask ^ (1 << u);
if (dpA[pm] == NEG) continue;
if ((inA[u] & pm) == 0) dpA[mask] = dpA[pm] + wA[u];
}
vector<int64> bestA = dpA; // max over submasks
for (int i = 0; i < n1; ++i)
for (int mask = 0; mask < sizeA; ++mask)
if (mask & (1 << i))
bestA[mask] = max(bestA[mask], bestA[mask ^ (1 << i)]);
// Enumerate B subsets, keep only independent ones
int sizeB = 1 << n2;
auto indep_and_sum_B = [&](int mask)->pair<bool,int64>{
int tmp = mask;
int64 sum = 0;
while (tmp) {
int v = __builtin_ctz(tmp);
tmp ^= (1 << v);
if (inB[v] & tmp) return {false, 0};
sum += wB[v];
}
return {true, sum};
};
int64 ans = 0;
for (int mask = 0; mask < sizeB; ++mask) {
auto [ok, sumB] = indep_and_sum_B(mask);
if (!ok) continue;
unsigned int forbidA = 0;
int tmp = mask;
while (tmp) {
int v = __builtin_ctz(tmp);
tmp ^= (1 << v);
forbidA |= crossBA[v];
}
int allowA = ((1 << n1) - 1) & ~((int)forbidA);
ans = max(ans, sumB + bestA[allowA]);
}
cout << ans << '\n';
return 0;
}