int f[MAXN * 2], vis[MAXN * 2], cnt[MAXN * 2]; int n, m, p;
intfind(int k){ return k == f[k] ? k : f[k] = find(f[k]); }
intmain(){ int T;
cin >> T; while(T--) { char s[20];
memset(vis, 0, sizeof(vis)); memset(cnt, 0, sizeof(cnt)); memset(f, 0, sizeof(f)); cin >> n >> m; for(int i = 1; i <= n * 2; i++) { f[i] = i; } for(int i = 1; i <= m; i++) { int x, y;
cin >> x >> y >> s; if(s[0] == 'c') { f[find(x)] = f[find(y)]; f[find(x + n)] = find(y + n); } else { f[find(x)] = find(y + n); f[find(x + n)] = find(y); } } bool flag = true; for(int i = 1; i <= n; i++) { if(find(i) == find(i + n)) { flag = false; // 无解 } } if(!flag) { cout << -1 << endl; continue; } p = 0; for(int i = 1; i <= n * 2; i++) { if(i > n) { cnt[find(i)]++; //统计每个集合的内鬼总数 } } int ans = 0; for(int i = 1; i <= n; i++) { if(vis[find(i)] || vis[find(i + n)]) { continue; //如果这个点已经访问过,就不再访问 } ans += max(cnt[find(i)], cnt[find(i + n)]); //选取内鬼较多的集合,加上其内鬼总数 vis[find(i)] = true; vis[find(i + n)] = true; //标记访问 } cout << ans << endl; }