#include<iostream> #include<cstdio> #include<vector> #include<functional> #include<algorithm> using namespace std; const int N = 5e5 + 5, M = 5e6 + 5;
int n, m, k; int tot, id[N], d[N], f[N]; int w[N], dfn[N], low[N], stk[N], top; int head[N], ver[M], net[M], idx, scc_cnt; bool in_stk[N]; vector<int> val[N], tmp;
void add(int a, int b) { net[++idx] = head[a], ver[idx] = b, head[a] = idx; }
void tarjan(int u) { stk[++top] = u, dfn[u] = low[u] = ++tot; in_stk[u] = true; for (int i = head[u]; i; i = net[i]) { int v = ver[i]; if (!dfn[v]) { tarjan(v); low[u] = min(low[u], low[v]); } else if (in_stk[v]) low[u] = min(low[u], dfn[v]); } if (low[u] == dfn[u]) { int v; scc_cnt++; do { v = stk[top--]; in_stk[v] = false; val[scc_cnt].push_back(w[v]); id[v] = scc_cnt; } while (u != v); } }
int main() { scanf("%d%d%d", &n, &m, &k); for (int i = 1; i <= n; i++) scanf("%d", &w[i]); for (int i = 1; i <= m; i++) { int u, v; scanf("%d%d", &u, &v); add(u, v); } for (int i = 1; i <= n; i++) if (!dfn[i]) tarjan(i); for (int u = 1; u <= n; u++) { for (int i = head[u]; i; i = net[i]) { int v = ver[i]; int a = id[u], b = id[v]; if (a != b) d[b]++; } } for (int i = 1; i <= scc_cnt; i++) { if (d[i]) for (int j = 0; j < val[i].size(); j++) tmp.push_back(val[i][j]); else { nth_element(val[i].begin(), val[i].begin() + 1, val[i].end()); for (int j = 1; j < val[i].size(); j++) tmp.push_back(val[i][j]); } } int ans = 0; nth_element(tmp.begin(), tmp.begin() + k, tmp.end(), greater<int>()); for (int i = 0; i < k; i++) ans += tmp[i]; printf("%d", ans); return 0; }