#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,m,q;
vector<int> con[200005], arb[200005];
int s[200005];
namespace DSU
{
int father[200005], siz[200005], strongest[200005];
void init()
{
for(int i=1;i<=n;i++)
{
father[i] = i;
siz[i] = 1;
strongest[i] = i;
}
}
int get(int x)
{
if(father[x] != x)
father[x] = get(father[x]);
return father[x];
}
void unite(int x, int y)
{
x = get(x);
y = get(y);
if(x == y)
return;
if(siz[x] < siz[y])
swap(x,y);
siz[x] += siz[y];
father[y] = x;
if(s[strongest[y]] > s[strongest[x]])
strongest[x] = strongest[y];
}
}
bool cmp_s(int x, int y)
{
return s[x] < s[y];
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n>>m>>q;
for(int i=1;i<=n;i++)
cin>>s[i];
int rez = 0;
int u,v;
vector<pair<pair<int,int>, pair<int,int>>> edges_ord;
for(int i=1;i<=m;i++)
{
cin>>u>>v;
con[u].push_back(v);
con[v].push_back(u);
if(s[u] < s[v])
swap(u, v);
edges_ord.push_back({{s[u], s[v]}, {u, v}});
}
sort(edges_ord.begin(), edges_ord.end());
DSU::init();
for(auto [_,e]:edges_ord)
{
int i = e.first, x = e.second;
assert(s[i] >= s[x]);
if(DSU::get(i) != DSU::get(x))
{
int u = DSU::strongest[DSU::get(x)];
rez += s[i] - s[u];
arb[i].push_back(u);
DSU::unite(x, i);
rez += s[x];
}
}
/*vector<pair<int,int>> ord;
for(int i=1;i<=n;i++)
ord.push_back({s[i], i});
sort(ord.begin(), ord.end());
vector<bool> done(n+2,0);
DSU::init();
for(auto [_,i]:ord)
{
sort(con[i].begin(), con[i].end(), cmp_s);
for(int x:con[i])
{
if(!done[x])
continue;
if(DSU::get(x) != DSU::get(i))
{
int u = DSU::strongest[DSU::get(x)];
rez += s[i] - s[u];
arb[i].push_back(u);
DSU::unite(x, i);
rez += s[x];
}
}
done[i] = 1;
}*/
cout<<rez;
return 0;
}