#include<iostream>
void bing(int a,int b){
int x=find(a),y=find(b);
if(x==y)return;
f[x]=y;
tot--;}
int main(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
tot=n;
while(m--){
int a,b;
char s;
cin>>s>>a>>b;
if(s=='F')
bing(a,b);
if(s=='E')
{
if(!e[a])e[a]=b; //不用二维数组会超时 输入马上判断
else bing(e[a],b); //X,Y是敌人 e[x]代表X的敌人 如果没有 就进入敌人数组
if(!e[b])e[b]=a; //如果已有 就把敌人合并到一起 两个朋友(一个人的两个不同敌人)
else bing(e[b],a);
}
}
cout<<tot;
return 0;
using namespace std;
int f[10000],e[10000]={0},tot;
int find(int i){if(f[i]!=i)f[i]=find(f[i]);//路径压缩
return f[i];
}void bing(int a,int b){
int x=find(a),y=find(b);
if(x==y)return;
f[x]=y;
tot--;}
int main(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
tot=n;
while(m--){
int a,b;
char s;
cin>>s>>a>>b;
if(s=='F')
bing(a,b);
if(s=='E')
{
if(!e[a])e[a]=b; //不用二维数组会超时 输入马上判断
else bing(e[a],b); //X,Y是敌人 e[x]代表X的敌人 如果没有 就进入敌人数组
if(!e[b])e[b]=a; //如果已有 就把敌人合并到一起 两个朋友(一个人的两个不同敌人)
else bing(e[b],a);
}
}
cout<<tot;
return 0;
}