#include<bits/stdc++.h>
using namespace std;
using ll = long long;
/// --- Union Find Library {{{ ///
struct UF {
int n;
vector<int> par, rank;
UF(int n): n(n), par(n, -1), rank(n, 0) {}
int find(int x) {
return par[x] < 0 ? x : par[x] = find(par[x]);
}
int size(int x) {
return -par[find(x)];
}
bool same(int a, int b) {
return find(a) == find(b);
}
void unite(int a, int b) {
a = find(a);
b = find(b);
if(a == b) return;
if(rank[a] > rank[b]) swap(a, b);
par[b] += par[a];
par[a] = b;
if(rank[a] == rank[b]) rank[b]++;
}
};
/// }}}--- ///
int main() {
ios::sync_with_stdio(false), cin.tie(0);
int n, m, k; cin >> n >> m >> k;
vector<int> c(n);
for(int &e : c) cin >> e;
vector<tuple<int, int, int>> g;
for(int i = 0; i < m; i++) {
int a, b, w; cin >> a >> b >> w;
a--; b--;
g.emplace_back(w, a, b);
if(c[a]) g.emplace_back(0, a, n + c[a]);
if(c[b]) g.emplace_back(0, b, n + c[b]);
}
sort(begin(g), end(g));
UF uf(n + k + 10);
ll ans = 0, cnt = 0;
for(auto e : g) {
int w, a, b;
tie(w, a, b) = e;
if(uf.same(a, b)) continue;
uf.unite(a, b);
if(w) cnt++, ans += w;
if(cnt == k - 1) return(cout << ans << endl, 0);
}
cout << -1 << endl;
}