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
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <set>

using namespace std;

typedef vector<int> VI;
typedef long long LL;

#define FOR(x, b, e) for(int x = b; x <= (e); ++x)
#define FORD(x, b, e) for(int x = b; x >= (e); --x)
#define REP(x, n) for(int x = 0; x < (n); ++x)
#define VAR(v, n) __typeof(n) v = (n)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(x) ((int)(x).size())
#define FOREACH(i, c) for(VAR(i, (c).begin()); i != (c).end(); ++i)
#define PB push_back
#define ST first
#define ND second
#define MP make_pair

typedef pair<int,int> para;
typedef pair<para, para > four;


int main() {
	int n, m, k, a, b, j, l, g0;
	LL o=0;
	VI g, id;
	vector<para > ab, cd;
	vector<four > r;
	vector<vector<bool> > kod;

	scanf("%d%d%d",&n,&m,&k);
  g.reserve(n+1); g.PB(0);
  id.resize(n+1,0);
  kod.resize(n+1);
  r.reserve(m);
  ab.reserve(m);
  cd.reserve(k);

  REP(i,n) {
    scanf("%d",&a);
    g.PB(a);
  }

  REP(i,m) {
    scanf("%d%d",&a,&b);
    ab.PB(MP(a,b));
  }

int licz=0;
  FORD(i,m-1,0) {
    a=ab[i].ST;
    b=ab[i].ND;
    if (id[b]==0) id[b]=b;
    id[a]=id[b];
    kod[a]=kod[b];
    kod[a].PB(false);
    kod[b].PB(true);
  }

  REP(i,k) {
    scanf("%d%d",&a,&b);
    if (id[a] != id[b] || id[a]==0) continue;

    l=min(kod[a].size(),kod[b].size());
    for(j=0;j<l;j++)
      if(kod[a][j] != kod[b][j]) break;
    r.PB(MP(MP(-j,i),MP(a,b)));
  }

  sort(ALL(r));

  FOREACH(it,r) {
    four r0=*it;
    a=r0.ND.ST;
    b=r0.ND.ND;
    g0=min(g[a],g[b]);
    g[a]-=g0;
    g[b]-=g0;
    o+=g0;
  }

  cout<<o+o<<endl;
	return 0;
}