#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

const int INF = 100000;

struct UF{
    int par[202],r[202],cnt;
    void init(){
        for(int i = 0 ; i < 202 ; i ++){
            par[i] = i;
            r[i] = 0;
        }
        cnt = 0;
    }
    int find(int x){
        if(par[x] == x)return x;
        return par[x] = find(par[x]);
    }
    bool same(int x,int y){
        return find(x) == find(y);
    }
    void unit(int x,int y){
        if(same(x,y))return;
        cnt ++;
        x = find(x);
        y = find(y);
        if(r[x] < r[y]){
            par[x] = y;
        }
        else {
            par[y] = x;
            if(r[x] == r[y]){
                r[x] ++;
            }
        }
    }
}uf;

int main(){
    while(1){
        int n,m,k;
        scanf("%d%d%d",&n,&m,&k);
        if(n == 0 && m == 0 && k == 0)return 0;
        uf.init();
        vector<pair<int,pair<int,int>>> A,B;
        for(int i = 0 ; i < m ; i ++){
            int u,v,w;
            char l;
            scanf("%d%d%d %c",&u,&v,&w,&l);
            if(l == 'A')A.push_back(pair<int,pair<int,int>>(w,pair<int,int>(u,v)));
            else B.push_back(pair<int,pair<int,int>>(w,pair<int,int>(u,v)));
            uf.unit(u,v);
        }
        if(uf.cnt < n-1){
            puts("-1");
            continue;
        }
        vector<pair<int,pair<int,int>>> _A,_B;
        sort(A.begin(),A.end());
        uf.init();
        for(int i = 0 ; i < A.size() ; i ++){
            if(uf.same(A[i].second.first,A[i].second.second)){}
            else {
                uf.unit(A[i].second.first,A[i].second.second);
                _A.push_back(A[i]);
            }
        }
        sort(B.begin(),B.end());
        uf.init();
        for(int i = 0 ; i < B.size() ; i ++){
            if(uf.same(B[i].second.first,B[i].second.second)){}
            else{
                uf.unit(B[i].second.first,B[i].second.second);
                _B.push_back(B[i]);
            }
        }
        if(k+_B.size() < n-1){
            puts("-1");
            continue;
        }
        
        /*puts("------_A------");
        for(int i = 0 ; i < _A.size() ; i ++){
            printf("%d %d %d%c",_A[i].first,_A[i].second.first,_A[i].second.second,10);
        }
        puts("------_B------");
        for(int i = 0 ; i < _B.size() ; i ++){
            printf("%d %d %d%c",_B[i].first,_B[i].second.first,_B[i].second.second,10);
        }*/
        
        k -= n-1-_B.size();
        vector<int> vec;
        int ret = 0;
        for(int i = 0 ; i < _A.size() ; i ++)ret += _A[i].first;
        for(int i = 0 ; i < _B.size() ; i ++)ret += _B[i].first;
        
        //cout << ret << endl;
        
        for(int i = 0 ; i < _B.size() ; i ++){
            uf.init();
            for(int j = 0 ; j < i ; j ++){
                uf.unit(_B[j].second.first,_B[j].second.second);
            }
            for(int j = 0 ; j <= _A.size() ; j ++){
                if(j == _A.size()){
                    vec.push_back(INF);
                    break;
                }
                uf.unit(_A[j].second.first,_A[j].second.second);
                if(uf.same(_B[i].second.first,_B[i].second.second)){
                    vec.push_back(_A[j].first-_B[i].first);
                    ret -= _A[j].first;
                    break;
                }
            }
            //cout << i << " " << vec[vec.size()-1] << endl;
        }
        sort(vec.begin(),vec.end());
        for(int i = 0 ; i < k ; i ++){
            ret += vec[i];
            if(vec[i] == INF)ret = INF;
        }
        if(ret >= INF)ret = -1;
        printf("%d%c",ret,10);
    }
}

Measured memory_bytes: 3296