#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 5e3 + 10, M = 5e6 + 10;
struct node {
int l, r, p;
} a[N];
int n, m;
int b[N * 2], idx;
int fa[M];
int find(int x) {
return fa[x] = fa[x] == x ? x : find(fa[x]);
}
void merge(int x, int y) {
fa[find(x)] = find(y);
}
int main() {
scanf("%d%d", &n, &m);
for(int i = 1; i <= m; i++) {
scanf("%d%d", &a[i].l, &a[i].r);
a[i].l--;
b[++idx] = a[i].l, b[++idx] = a[i].r;
string x;
cin >> x;
if(x == "odd") a[i].p = 2;
}
sort(b + 1, b + 1 + idx);
n = unique(b + 1, b + 1 + idx) - b;
for(int i = 1; i <= n * 2; i++) {
fa[i] = i;
}
for(int i = 1; i <= m; i++) {
a[i].l = lower_bound(b + 1, b + 1 + n, a[i].l) - b;
a[i].r = lower_bound(b + 1, b + 1 + n, a[i].r) - b;
if(a[i].p == 2) {
if(find(a[i].l) == find(a[i].r)) {
printf("%d", i - 1);
return 0;
}
merge(a[i].l, a[i].r + n);
merge(a[i].l + n, a[i].r);
} else {
if(find(a[i].l) == find(a[i].r + n)) {
printf("%d", i - 1);
return 0;
}
merge(a[i].l, a[i].r);
merge(a[i].l + n, a[i].r + n);
}
}
printf("%d", m);
return 0;
}
谢谢啦