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
#include<iostream>
#include<vector>
#include<list>
#include<algorithm>

#define LUINT std::list<unsigned int>
#define VECUINT std::vector<unsigned int>
#define PUII std::pair<unsigned int, unsigned int>
#define pb push_back
#define CI const_iterator
#define ULL unsigned long long

struct Element{
	unsigned int x;
	unsigned int p;
	unsigned int s;
	LUINT sons;
};

struct Zbiory{
	std::vector<Element> wieszak;
	Zbiory(unsigned int n):wieszak(n){
		for(unsigned int i=0;i<n;++i) 
			wieszak[i].x=wieszak[i].p=i,wieszak[i].s=0;
	}
	unsigned int Find(unsigned int x){
		if(wieszak[x].p!=x)
			wieszak[x].p=Find(wieszak[x].p);
		return wieszak[x].p;
	}
	unsigned int Union(unsigned int a, unsigned int b){
		a=Find(a),b=Find(b);
		if(wieszak[a].s<wieszak[b].s)
			wieszak[a].p=b,wieszak[b].sons.pb(a);
		else
			wieszak[b].p=a,wieszak[a].sons.pb(b);
		
		if(wieszak[a].s==wieszak[b].s)
			wieszak[a].s++;
		
		return Find(a);
	}
	
	LUINT Traverse(unsigned int x){
		LUINT R;
		Traverse_DFS(x,R);
		return R;
	}
	
	void Traverse_DFS(unsigned int x, LUINT & R){
		R.pb(x);
		for(LUINT::CI iE=wieszak[x].sons.begin();iE!=wieszak[x].sons.end();++iE)
			Traverse_DFS(*iE,R);
	}
};


int main(){
	std::ios_base::sync_with_stdio(false);
	
	unsigned int n,m,k;
	std::cin>>n>>m>>k;
	
	VECUINT Wagi(n);
	std::vector<PUII> Sekwencja(m), Reakcje(2*k);
	std::vector<LUINT> Spis(n);
	
	for(unsigned int i=0;i<n;++i)
		std::cin>>Wagi[i];
	for(unsigned int i=0;i<m;--Sekwencja[i].first,--Sekwencja[i].second,++i)
		std::cin>>Sekwencja[i].first>>Sekwencja[i].second;
	for(unsigned int i=0;i<2*k;i+=2){
		std::cin>>Reakcje[i].first>>Reakcje[i].second;
		Reakcje[i+1].first=--Reakcje[i].second;
		Reakcje[i+1].second=--Reakcje[i].first;
		Spis[Reakcje[i].first].pb(i);
		Spis[Reakcje[i+1].first].pb(i+1);
	}
	
	Zbiory Fiolki(n);
	ULL R=0;
	for(unsigned int i=0;i<m;++i){
		Sekwencja[i].first=Fiolki.Find(Sekwencja[i].first);
		Sekwencja[i].second=Fiolki.Find(Sekwencja[i].second);
		if(Fiolki.wieszak[Sekwencja[i].second].s<Fiolki.wieszak[Sekwencja[i].first].s)
			std::swap(Sekwencja[i].first,Sekwencja[i].second);
		
		LUINT Zrodla=Fiolki.Traverse(Sekwencja[i].first);
		VECUINT Kolejka;
		for(LUINT::CI iE=Zrodla.begin();iE!=Zrodla.end();++iE)
			Kolejka.insert(Kolejka.end(),Spis[*iE].begin(),Spis[*iE].end());
		std::sort(Kolejka.begin(),Kolejka.end());
		for(unsigned int j=0;j<Kolejka.size();++j)
			if(Fiolki.Find(Reakcje[Kolejka[j]].second)==Sekwencja[i].second){
				unsigned int l=std::min(Wagi[Reakcje[Kolejka[j]].first],Wagi[Reakcje[Kolejka[j]].second]);
				Wagi[Reakcje[Kolejka[j]].first]-=l;
				Wagi[Reakcje[Kolejka[j]].second]-=l;
				R+=2*l;
			}
				
		Fiolki.Union(Sekwencja[i].first,Sekwencja[i].second);
	}
	
	std::cout<<R<<"\n";
	
	return 0;
}