1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <cstdlib>
#include <cstdio>
#include <utility>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define PB push_back
#define FOR(i, a, b) for(int i =(a); i <=(b); ++i)
#define RE(i, n) FOR(i, 1, n)
#define FORD(i, a, b) for(int i = (a); i >= (b); --i)
#define REP(i, n) for(int i = 0;i <(n); ++i)
#define VAR(v, i) __typeof(i) v=(i)
#define FORE(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define ALL(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
#define PB push_back
#define MP make_pair
#ifdef LOCAL
#define debug(x) {cerr <<#x <<" = " <<x <<"\n"; }
#define debugv(x) {{cerr <<#x <<" = "; FORE(itt, (x)) cerr <<*itt <<", "; cerr <<"\n"; }}
#else
#define debug(x)
#define debugv(x)
#endif
#define make(type, x) type x; cin>>x;
#define make2(type, x, y) type x, y; cin>>x>>y;
#define make3(type, x, y, z) type x, y, z; cin>>x>>y>>z;
using namespace std;
typedef long long ll;
typedef long double LD;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
typedef vector<int> VI;
typedef vector<ll> VLL;
typedef vector<pair<int, int> > VPII;
typedef vector<pair<ll, ll> > VPLL;

void mini(int& a4, int b4){a4=min(a4, b4); }
void maxi(int& a4, int b4){a4=max(a4, b4); }
template<class T1, class T2>
ostream& operator<< (ostream &out, pair<T1, T2> pair) { return out << "(" << pair.first << ", " << pair.second << ")";}

const int N = 5e5 + 5;
vector<pair<int, int> > slo[N];
int rep[N];
int g[N];
vector<pair<int, int> > edges_ord;
pair<int, int> to_union[N];
pair<int, int> edge[N];
vector<int> member[N];
int Find(int v) {
  if (rep[v] == v) {
    return v;
  }
  rep[v] = Find(rep[v]);
  return rep[v];
}
void Union(int a, int b, int cnt) {
  a = Find(a);
  b = Find(b);
  if (member[a].size() < member[b].size()) {
    swap(a, b);
  }
  rep[b] = a;
  for (int mem : member[b]) {
    //cerr<<"Przerzucam "<<mem<<" pod "<<a<<endl; 
    for (auto e : slo[mem]) {
      //cerr<<"Sprawdzam krawedz "<<mem<<" "<<e.first<<endl;
      if (Find(e.first) == a) {
        //cerr<<"Hej "<<e.second<<endl;
        mini(edges_ord[e.second].first, cnt);
      }
    }
    member[a].PB(mem);
  }
  member[b].clear();
}
int main() {
  // nie zapomnij o ll
  ios_base::sync_with_stdio(0);
  cout << fixed << setprecision(10);
  
  make3(int, n, m, k);
  RE (i, n) {
    rep[i] = i;
    member[i].PB(i);
    cin>>g[i];
  }
  RE (i, m) {
    make2(int, a, b);
    to_union[i] = MP(a, b);
  }
  RE (i, k) {
    make2(int, c, d);
    edge[i - 1] = MP(c, d);
    slo[c].PB(MP(d, i - 1));
    slo[d].PB(MP(c, i - 1));
    edges_ord.PB(MP(N, i - 1));
  }
  RE (i, m) {
    Union(to_union[i].first, to_union[i].second, i);
    /* RE (j, n) {
      debugv(member[j]);
    } */
  }
  sort(ALL(edges_ord));
  ll res = 0;
  for (auto p : edges_ord) {
    if (p.first >= N) {
      continue;
    }
    PII e = edge[p.second];
    ll osad = min(g[e.first], g[e.second]);
    res += 2 * osad;
    g[e.first] -= osad;
    g[e.second] -= osad;
  }
  cout<<res<<endl;
  return 0;
}