using
System;
using
System.Collections.Generic;
using
System.Linq;
class
GFG {
static
int
N = 100001;
static
int
[] amt =
new
int
[N];
static
int
[] dp =
new
int
[N];
static
int
[] c =
new
int
[N];
static
int
[] parent =
new
int
[N];
static
int
[] sz =
new
int
[N];
static
List<
int
>[] v =
new
List<
int
>[ N ];
static
int
Find(
int
i)
{
if
(parent[i] == i)
return
i;
parent[i] = Find(parent[i]);
return
parent[i];
}
static
void
Union(
int
a,
int
b)
{
int
p1 = Find(a);
int
p2 = Find(b);
if
(p1 == p2)
return
;
if
(sz[p1] < sz[p2]) {
int
temp = p1;
p1 = p2;
p2 = temp;
}
parent[p2] = p1;
sz[p1] += sz[p2];
c[p1] += c[p2];
c[p2] = 0;
}
static
void
Dfs(
int
src,
int
par)
{
dp[src] = c[src];
int
mx = 0;
foreach
(
int
x
in
v[src])
{
if
(x == par)
continue
;
Dfs(x, src);
mx = Math.Max(mx, dp[x]);
}
dp[src] += mx;
}
static
void
MaximumMoney(
int
n,
int
[] amt,
int
[][] friends,
int
[][] groups)
{
for
(
int
i = 1; i <= n; i++) {
parent[i] = i;
sz[i] = 1;
c[i] = amt[i - 1];
v[i] =
new
List<
int
>();
}
int
p = friends.Length;
for
(
int
i = 0; i < p; i++)
Union(friends[i][0], friends[i][1]);
int
m = groups.Length;
for
(
int
i = 0; i < m; i++) {
int
p1 = Find(groups[i][0]);
int
p2 = Find(groups[i][1]);
if
(p1 != p2) {
v[p1].Add(p2);
v[p2].Add(p1);
}
}
Dfs(Find(1), 0);
int
ans = 0;
for
(
int
i = 1; i <= n; i++)
ans = Math.Max(ans, dp[Find(i)]);
Console.WriteLine(ans);
}
static
void
Main(
string
[] args)
{
int
n = 7;
int
[] amt = { 5, 2, 3, 6, 1, 9, 8 };
int
[][] friends
= {
new
int
[] { 1, 2 },
new
int
[] { 2, 3 },
new
int
[] { 4, 5 },
new
int
[] { 6, 7 } };
int
[][] groups
= {
new
int
[] { 1, 4 },
new
int
[] { 1, 6 } };
MaximumMoney(n, amt, friends, groups);
}
}