#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,m,w[1000+10],l[1000+10],r[1000+10];
long long f[1000+10][100+10];
void readdata()
{
int x,y,t;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {scanf("%d",&w[i]);f[i][1]=w[i];}
for(int i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(l[x]==0)l[x]=y;//转二叉树
else
{
t=l[x];
while(r[t]!=0)
{
t=r[t];
}
r[t]=y;
}
}
}
long long dfs(int k,int people)//动归
{
long long t=-2000000000,x;
if(f[k][people]!=0) return f[k][people];
if(k==0||people==0) return 0;
for(int i=1;i<people;i++)
{
if(l[k]==0) break;
x=dfs(l[k],i);
}
for(int i=1;i<=people;i++)
{
if(r[k]==0) break;
x=dfs(r[k],i);
}
for(int i=0;i<people;i++)
for(int j=0;j<people;j++)
if(i+j<people)t=max(t,f[r[k]][i]+f[l[k]][j]+w[k]);
t=max(t,f[r[k]][people]);
if(t>=0)return f[k][people]=t;
else return f[k][people]=0;
}
void work()
{
long long ans=dfs(l[0],m);
cout<<ans;
}
int main()
{
readdata();
work();
return 0;
}