#include<iostream>
#include<stdio.h>
using namespace std;
int n,m;
int dp[10005][2];
int boss[10005];
int vis[10005];
void dis(int node)
{
vis[node]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&boss[i]==node)
{
dis(i);
dp[node][1]+=dp[i][0];
dp[node][0] +=max(dp[i][1],dp[i][0]);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>dp[i][1];
}
int root;
for(int i=1;i<n;i++)
{
int a,b;
boss[a]=b;
root=b;
}
while(boss[root])
root=boss[root];
dis(root);
cout<<max(dp[root][0],dp[root][1]);
return 0;
}
#include<stdio.h>
using namespace std;
int n,m;
int dp[10005][2];
int boss[10005];
int vis[10005];
void dis(int node)
{
vis[node]=1;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&boss[i]==node)
{
dis(i);
dp[node][1]+=dp[i][0];
dp[node][0] +=max(dp[i][1],dp[i][0]);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>dp[i][1];
}
int root;
for(int i=1;i<n;i++)
{
int a,b;
boss[a]=b;
root=b;
}
while(boss[root])
root=boss[root];
dis(root);
cout<<max(dp[root][0],dp[root][1]);
return 0;
}