#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct TEdge
{
int u, v, w;
} a[100005];
int n, m, k, c[100005], dsu[200005];
long long ans = 0;
inline bool operator<(const TEdge &a, const TEdge &b)
{
return a.w < b.w;
}
int trace(int u)
{
return (dsu[u] < 0 ? u : dsu[u] = trace(dsu[u]));
}
bool unity(int u, int v)
{
if ((u = trace(u)) == (v = trace(v)))
return false;
if (dsu[u] > dsu[v])
swap(u, v);
dsu[u] += dsu[v];
dsu[v] = u;
return true;
}
int main()
{
memset(dsu, -1, sizeof(dsu));
scanf("%d%d%d", &n, &m, &k);
--k;
for (int i = 1; i <= n; i++)
{
scanf("%d", c + i);
if (c[i] == 0)
c[i] = n + i;
}
for (int i = 1; i <= m; i++)
scanf("%d%d%d", &a[i].u, &a[i].v, &a[i].w);
sort(a + 1, a + m + 1);
for (int i = 1; k && i <= m; i++)
if (unity(c[a[i].u], c[a[i].v]))
{
ans += a[i].w;
--k;
}
printf("%lld", k ? -1 : ans);
}