#include <iostream>
#include <queue>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
struct edge {
int x;
int y;
int cost;
edge(int a, int b, int c) {
x = a;
y = b;
cost = c;
}
bool operator<(edge &other) {
if (this->cost < other.cost) {
return true;
}
else {
return false;
}
}
};
vector<edge> kv;
int parent[100001];
int get_parent(int x) {
if (parent[x] == x) {
return parent[x];
}
else {
parent[x] = get_parent(parent[x]);
return parent[x];
}
}
void Union(int a, int b) {
a = get_parent(a);
b = get_parent(b);
if (a < b) {
parent[b] = a;
}
else {
parent[a] = b;
}
}
int n, m;
int sch[1001] = { 0, }; // 0 남자 , 1 여자
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cin >> n >> m;
for (int i = 1; i <= n; i++) {
parent[i] = i;
string str;
cin >> str;
if (str == "M") {
sch[i] = 0;
}
else {
sch[i] = 1;
}
}
for (int i = 0; i < m; i++) {
int a, b, c;
cin >> a >> b >> c;
if (sch[a] != sch[b]) {
edge e(a, b, c);
kv.push_back(e);
}
}
sort(kv.begin(), kv.end());
int answer = 0;
for (int i = 0; i < m; i++) {
int x = kv[i].x;
int y = kv[i].y;
int a = get_parent(x);
int b = get_parent(y);
int cost = kv[i].cost;
if (a != b) {
Union(a, b);
answer += cost;
}
}
for (int i = 1; i <= n; i++) {
if (get_parent(i) != 1) {
cout << -1;
return 0;
}
}
cout << answer;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDx2ZWN0b3I+CiNpbmNsdWRlIDxzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnN0cnVjdCBlZGdlIHsKCWludCB4OwoJaW50IHk7CglpbnQgY29zdDsKCWVkZ2UoaW50IGEsIGludCBiLCBpbnQgYykgewoJCXggPSBhOwoJCXkgPSBiOwoJCWNvc3QgPSBjOwoJfQoJYm9vbCBvcGVyYXRvcjwoZWRnZSAmb3RoZXIpIHsKCQlpZiAodGhpcy0+Y29zdCA8IG90aGVyLmNvc3QpIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWVsc2UgewoJCQlyZXR1cm4gZmFsc2U7CgkJfQoJfQp9OwoKCnZlY3RvcjxlZGdlPiBrdjsKaW50IHBhcmVudFsxMDAwMDFdOwoKaW50IGdldF9wYXJlbnQoaW50IHgpIHsKCWlmIChwYXJlbnRbeF0gPT0geCkgewoJCXJldHVybiBwYXJlbnRbeF07Cgl9CgllbHNlIHsKCQlwYXJlbnRbeF0gPSBnZXRfcGFyZW50KHBhcmVudFt4XSk7CgkJcmV0dXJuIHBhcmVudFt4XTsKCX0KfQoKdm9pZCBVbmlvbihpbnQgYSwgaW50IGIpIHsKCWEgPSBnZXRfcGFyZW50KGEpOwoJYiA9IGdldF9wYXJlbnQoYik7CglpZiAoYSA8IGIpIHsKCQlwYXJlbnRbYl0gPSBhOwoJfQoJZWxzZSB7CgkJcGFyZW50W2FdID0gYjsKCX0KfQoKaW50IG4sIG07CmludCBzY2hbMTAwMV0gPSB7IDAsIH07IC8vIDAg64Ko7J6QICwgMSDsl6zsnpAKaW50IG1haW4oKSB7CgoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7IAoJY2luLnRpZShudWxscHRyKTsgCgljb3V0LnRpZShudWxscHRyKTsKCgljaW4gPj4gbiA+PiBtOwoJZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CgkJcGFyZW50W2ldID0gaTsKCQlzdHJpbmcgc3RyOwoJCWNpbiA+PiBzdHI7CgkJaWYgKHN0ciA9PSAiTSIpIHsKCQkJc2NoW2ldID0gMDsKCQl9CgkJZWxzZSB7CgkJCXNjaFtpXSA9IDE7CgkJfQoJfQoJCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCBhLCBiLCBjOwoJCWNpbiA+PiBhID4+IGIgPj4gYzsKCQlpZiAoc2NoW2FdICE9IHNjaFtiXSkgewoJCQllZGdlIGUoYSwgYiwgYyk7CgkJCWt2LnB1c2hfYmFjayhlKTsKCQl9Cgl9Cglzb3J0KGt2LmJlZ2luKCksIGt2LmVuZCgpKTsKCWludCBhbnN3ZXIgPSAwOwoJCglmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewoJCWludCB4ID0ga3ZbaV0ueDsKCQlpbnQgeSA9IGt2W2ldLnk7CgkJCgkJaW50IGEgPSBnZXRfcGFyZW50KHgpOwoJCWludCBiID0gZ2V0X3BhcmVudCh5KTsKCQlpbnQgY29zdCA9IGt2W2ldLmNvc3Q7CgoJCWlmIChhICE9IGIpIHsKCQkJVW5pb24oYSwgYik7CgkJCWFuc3dlciArPSBjb3N0OwoJCX0KCX0KCWZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewoJCWlmIChnZXRfcGFyZW50KGkpICE9IDEpIHsKCQkJY291dCA8PCAtMTsKCQkJcmV0dXJuIDA7CgkJfQoJfQoKCWNvdXQgPDwgYW5zd2VyOwp9