#include <bits/stdc++.h>
using namespace std;
#define FOR(i,l,r) for(int i = l; i <= r; i++)
#define COR(i,r,l) for(int i = r; i >= l; i--)
#define REP(i,n) for(int i = 0; i < n; i++)
#define FILL(a,b) memset(a, b, sizeof(a))
#define INF 1047483647
#define eps 1e-9
#define MP make_pair
#define FI first
#define SE second
#define PB push_back
#define sqr(x) ((x)*(x))
#define N 222304
typedef long long LL;
typedef pair<int , int> PII;
int w[N][2], f[N][2], g[N][2], cir[N], vis[N], sti[N], cnc[N];
vector<PII> h[N];
int dfs(int x, int from){
	if(vis[x]) return x;
	vis[x] = true;
	int ret = 0;
	for(auto t:h[x]){
		int v = t.FI, j = t.SE;
		if(j == from) continue;
		if(cir[v]) continue;
		int b = dfs(v, j);
		if(ret == 0) ret = b;
		
	}
	if(ret) cir[x] = ret;
	if(ret == x) return 0;
	else return ret;
}
int stick(int x, int from){
	if(vis[x]) return -1;
	vis[x] = true;
	int ret = 0;
	for(auto t:h[x]){
		int v = t.FI, j = t.SE;
		if(j == from) continue;
		int b = stick(v, j);
		if(b == 0){
			w[x][1] += w[v][0];
			w[x][0] += max(w[v][1], w[v][0]);
		}
		else ret = b;
	}
	if(cir[x]) return -1;
	if(ret == 0) sti[x] = true;
	return ret;
}
void dp(int x, int from, int num){
	if(cnc[x]){//connect edge
		for(auto t:h[x]){
			int v = t.FI, j = t.SE;
			if(j == from) continue;
			if(sti[v]) continue;
			dp(v, j, 0);
			f[x][0] += max(f[v][0], f[v][1]);
			f[x][1] += f[v][0];
		}
	}
	else if(cir[x] && cir[x] != cir[num]){//first
		bool viscir = false;
		for(auto t:h[x]){
			int v = t.FI, j = t.SE;
			if(j == from) continue;
			if(cir[v] == cir[x]){
				if(viscir) continue;
				dp(v, j, x);
				f[x][0] += max(f[v][0], f[v][1]);
				f[x][1] += g[v][0];
				viscir = true;
			}
			else if(cnc[v] || cir[v]){
				dp(v, j, 0);
				f[x][0] += max(f[v][0], f[v][1]);
				f[x][1] += f[v][0];
			}
		}
	}
	else if(cir[x] && cir[x] == cir[num]){
		bool las = false;
		for(auto t:h[x]){
			int v = t.FI, j = t.SE;
			if(j == from) continue;
			if(cir[v] == cir[x]){// v is in circle
				if(v != num) dp(v, j, num);
				if(v == num){//x is last in circle
					las = true;
					continue;
				}
				// x isn't last in circle
				f[x][0] += max(f[v][0], f[v][1]);
				f[x][1] += f[v][0];
				g[x][0] += max(g[v][0], g[v][1]);
				g[x][1] += g[v][0];
			}
			else if(cnc[v] || cir[v]){// v isnt' in this circle
				dp(v, j, 0);
				f[x][0] += max(f[v][0], f[v][1]);
				f[x][1] += f[v][0];
				g[x][0] += max(f[v][0], f[v][1]);
				g[x][1] += f[v][0];
			}
		}
		if(las) g[x][1] = 0; else g[x][1] += w[x][1];
		g[x][0] += w[x][0];
	}
	f[x][0] += w[x][0];
	f[x][1] += w[x][1];
}
int main() {
	int n, m, x, y;
	scanf("%d%d",&n, &m);
	FOR(i,1,n) scanf("%d", &w[i][1]);
	FOR(i,1,m){
		scanf("%d%d", &x, &y);
		h[x].PB(MP(y, i));
		h[y].PB(MP(x, i));
	}
	FILL(vis, 0);
	dfs(1, 0);
	FILL(vis, 0);
	FOR(i,1,n) if(cir[i]){
		stick(i, 0);
		break;
	}
	FOR(i,1,n) if(!cir[i] && !sti[i]) cnc[i] = true;
	FILL(f, 0); FILL(g, 0);
	FOR(i,1,n) if(!sti[i]){
		dp(i, 0, 0);
		printf("%d\n", max(f[i][0], f[i][1]));
		break;
	}
	return 0;
}
