- 对一个区间[l,r],处理l和r+1。
- 合并时,通过奇偶性质和异或推一推就行了
- 只有当l和r+1都在同一个集合里,并且d[l]^d[r+1]!=op时矛盾(op为给定的l到r的奇偶).
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define INIT(a,b) memset(a,b,sizeof(a))
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;++i)
#define repd(i,a,b) for(int i=a;i>=b;--i)
#define S(d) scanf("%d",&d)
#define SLL(d) scanf("%lld",&d)
#define P(d) printf("%d\n",d)
#define PLL(d) printf("%lld\n",d)
using namespace std;
const int inf=0x3f3f3f3f;
const int N=2e4+7;
const int M=2e6+7;
const int mod=1e9+7;
int f[N],d[N],b[N],m=0;
int op[N][3];
void init(int n){rep(i,1,n) f[i]=i;}
int find(int n){
if(n==f[n]) return n;
int root=find(f[n]);
d[n]^=d[f[n]];
return f[n]=root;
}
bool merge(int a,int b,int p){
int fa=find(a),fb=find(b);
if(fa!=fb) {
f[fa]=fb;
d[fa]=d[a]^d[b]^p;
return true;
}
if(d[a]^d[b]==p)return true;
else return false;
}
int main(){
int t,n;
char s[10];
scanf("%d%d",&t,&n);
rep(i,1,n){
scanf("%d%d%s",&op[i][0],&op[i][1],s);
op[i][0],op[i][1]++;
if(s[0]=='e') op[i][2]=0;
else op[i][2]=1;
b[++m]=op[i][0];b[++m]=op[i][1];
}
sort(b+1,b+1+m);
m=unique(b+1,b+1+m)-b-1;
init(m);
rep(i,1,n){
int x=lower_bound(b+1,b+1+m,op[i][0])-b;
int y=lower_bound(b+1,b+1+m,op[i][1])-b;
if(!merge(x,y,op[i][2])){
printf("%d\n",i-1);
return 0;
}
}
printf("%d\n",n);
return 0;
}