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
#include <iostream>
#include <cstdio>
#include <ctime>
#include <set>
#include <vector>
#include <algorithm>
#define LL long long
#define ff first
#define ss second
#define PB push_back
#define MP make_pair
#define DEBUG(x) cerr<<#x<<" "<<(x)<<endl;
using namespace std;
const int N = 200005, K = 500005;
int n, m, k, a, b, size;
int zostalo[N], From[N], To[N], rep[N];
vector<pair<int, int> >V[N];
vector<int>zbior[N];
pair<pair<int, int>, int>S[K];
int find(int w)
{
  if(rep[w] == w)
    return w;
  rep[w] = find(rep[w]);
  return rep[w];
}
int main()
{
  scanf("%d%d%d", &n, &m, &k);
  
  for(int i=1; i<=n; i++)
   scanf("%d", &zostalo[i]);
  for(int i=1; i<=m; i++)
   scanf("%d%d", &From[i], &To[i]);
  for(int i=1; i<=k; i++)
  {
    scanf("%d%d", &a, &b);
  
    V[a].PB(MP(i, b));
    V[b].PB(MP(i, a));
  }
  for(int i=1; i<=n; i++)
  {
    rep[i] = i;
    zbior[i].PB(i);
  } 
  LL wynik = 0;
  for(int i=1; i<=m; i++)
  {
    a = find(From[i]);
    b = find(To[i]);

    if(zbior[b].size() < zbior[a].size())
      swap(a, b);
    size = 0;
    for(int j=0; j<zbior[a].size(); j++)
    {
      int w = zbior[a][j];
      if(!zostalo[w])continue;
      for(int l=V[w].size()-1; l>=0; l--)
      {
	int u = V[w][l].ss;
	if(find(u) == b)
	{
	  S[++size] = MP(V[w][l], w);
	  swap(V[w][l], V[w].back());
	  V[w].pop_back();	  
	}
      }
    }
    sort(S+1, S+1+size);
    for(int j=1; j<=size; j++)
    {
      int w = S[j].ss;
      int u = S[j].ff.ss;
      if(zostalo[w] >= zostalo[u])
      {
	zostalo[w] -= zostalo[u];
	wynik += zostalo[u];
	zostalo[u] = 0;
      }
      else
      {
	zostalo[u] -= zostalo[w];
	wynik += zostalo[w];
	zostalo[w] = 0;
      }
    }
    for(int j=0; j<zbior[a].size(); j++)
    {
      int w = zbior[a][j];
      if(zostalo[w])
      zbior[b].PB(w);
    }
    zbior[a].clear();
    rep[a] = b;
  }
  
  printf("%lld", 2*wynik);
}