#include<bits/stdc++.h>
using namespace std;
const int N=100011,M=200011;
int v[M*2],pre[M*2],bia[N],num=0;
//map< pair<int,int>,bool > Nico;
void addedge(int l,int r)
{
    ++num;
    v[num]=r;pre[num]=bia[l];bia[l]=num;
}
int n,m;
int wei[N];
int color[N],nc=0;
bool vis[N];
int sta[N],nst=0;
vector<int> fri[N];
void dfs(int l,int f)
{
    //cout<<l<<" "<<f<<endl;
    if (vis[l]==true)
    {
        if (color[l]!=0) return;
        ++nc;
        int fr;
        for (int i=nst;i>=1;i--)
        {
            if (sta[i]==l)
            {
                fr=i;
                break;
            }
        }
        fri[nc].resize(0);
        for (int i=fr;i<=nst;i++)
        {
            fri[nc].push_back(sta[i]);
            color[sta[i]]=nc;
        }
        return;
    }
    //cout<<"still here\n";
    vis[l]=true;sta[++nst]=l;
    int r;
    for (int i=bia[l];i!=0;i=pre[i])
    {
        r=v[i];
        if (r==f) continue;
        dfs(r,l);
    }
    nst--;
}
//int e[N][2];

int g[N][2];
int dp(int l,int f,int tp)
{
    //cout<<l<<" "<<f<<" "<<tp<<endl;
    if (g[l][tp]!=-1) return g[l][tp];
    int r,ans;
    if (tp==0) ans=0;
    else ans=wei[l];
    for (int i=bia[l];i!=0;i=pre[i])
    {
        r=v[i];
        if (r==f || (color[l]!=0 && color[l]==color[r])) continue;
        if (tp==0) ans+=max(dp(r,l,1),dp(r,l,0));
        else ans+=dp(r,l,0);
    }
    if (color[l]==0 || fri[color[l]][0]!=l)
    {
        g[l][tp]=ans;
        return ans;
    }
    //cout<<"OUT!\n";
    //cout<<"WTF  "<<l<<" "<<f<<" "<<tp<<" "<<ans<<endl;
    int co;
    co=color[l];
    vector<int> e0,e1;
    e0.resize(fri[co].size()+5);
    e1.resize(fri[co].size()+5);
    e0[0]=e1[0]=-100000000;
    if (tp==0) e0[0]=ans;
    else e1[0]=ans;
    
    
    for (int i=1;i<fri[co].size();i++)
    {
        r=fri[co][i];
        e0[i]=max(e0[i-1],e1[i-1])+dp(r,l,0);
        e1[i]=e0[i-1]+dp(r,l,1);
    }
    /*cout<<"EEE"<<l<<" "<<" "<<ans<<" "<<tp<<"\n";
    for (int i=0;i<fri[co].size();i++) cout<<e[i][0]<<" "<<e[i][1]<<endl;
    cout<<"END\n";*/
    if (tp==1) ans=e0[fri[co].size()-1];
    else ans=max(e1[fri[co].size()-1],e0[fri[co].size()-1]);

    
    g[l][tp]=ans;
    return ans;
}
               
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d",&wei[i]);
    int l,r;
    memset(bia,0,sizeof(bia));
    for (int i=1;i<=m;i++)
    {
        scanf("%d%d",&l,&r);
        /*if (l==r) continue;
        if (l>r) swap(l,r);
        if (Nico[make_pair(l,r)]==true) continue;
        Nico[make_pair(l,r)]=true;*/
        addedge(l,r);addedge(r,l);
    }
    memset(g,-1,sizeof(g));
    int ans=0;
    memset(color,0,sizeof(color));
    nc=0;
    for (int i=1;i<=1;i++)
    {
        if (vis[i]==true) continue;
        nst=0;dfs(i,0);
        ans+=max(dp(i,0,0),dp(i,0,1));
    }
    /*cout<<"FRI\n";
    for (int i=1;i<=nc;i++)
    {
        for (int j=0;j<fri[i].size();j++) cout<<fri[i][j]<<" ";
        cout<<endl;
    }
    cout<<"ENDF\n";
    for (int i=1;i<=n;i++) cout<<i<<" "<<g[i][0]<<" "<<g[i][1]<<endl;*/
    
    printf("%d\n",ans);
}
   

