#include <iostream>
#include <algorithm>
using namespace std;
const int MAXE = 1000005;
const int MAXN = 1005;
typedef struct _edge
{
int u, v, w;
}E;
E edge[MAXE];
int fa[MAXN];
int findSet(int x)
{
if(x != fa[x])
fa[x] = findSet(fa[x]);
return fa[x];
}
bool Union(int x, int y)
{
int a = findSet(x);
int b = findSet(y);
if(a == b)
return false;
fa[b] = a;
return true;
}
void initSet()
{
for(int i = 0; i < MAXN; i++)
fa[i] = i;
}
bool cmp1(const E &a, const E &b)
{
return a.w < b.w;
}
bool cmp2(const E &a, const E &b)
{
return a.w > b.w;
}
int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int n, m, k;
while(scanf("%d %d %d", &n, &m, &k), n || m || k)
{
int u, v, w;
char op[5];
for(int i = 0; i < m; i++)
{
scanf("%s %d %d", op, &u, &v);
if(op[0] == 'B')
{
edge[i].u = u, edge[i].v = v;
edge[i].w = 1;
}
else
{
edge[i].u = u, edge[i].v = v;
edge[i].w = 0;
}
}
initSet();
int Min = 0, Max = 0;
sort(edge, edge + m, cmp1);
for(int i = 0; i < m; i++)
{
if(Union(edge[i].u, edge[i].v) && edge[i].w)
Min++;
}
initSet();
sort(edge, edge + m, cmp2);
for(int i = 0; i < m; i++)
{
if(Union(edge[i].u, edge[i].v) && edge[i].w)
Max++;
}
if(k >= Min && k <= Max)
printf("1\n");
else
printf("0\n");
}
return 0;
}