#include<iostream>
#include<iomanip>
#include<string>
#include<algorithm>
#include"vector"
#include<cstring>
#include"math.h"
#include"queue"
#include"stack"
#include<map>
using namespace std;
//带权并查集 奇偶数
struct node {
int fa;
int length;
};
node f[100100];
int find(int x) {
if (x == f[x].fa)
return x;
else {
f[x].length = (f[f[x].fa].length + f[x].length)%2;
f[x].fa = find(f[x].fa);
}
return f[x].fa;
}
int main() {
int n, k;
int cnt = 0;
cin >> n >> k;
for (int i = 0;i < 100100;i++) {
f[i].fa = i;
f[i].length = 0;
}
int flag = 0;
map<int, int>mmp;
for (int i = 0;i < k;i++) {
int x, y;
string tag;
cin >> x >> y >> tag;
if (flag == 1)
continue;
if (x > y) {
int temp = x;
x = y;
y = temp;
}
if (mmp.find(x - 1) == mmp.end()) {
mmp.insert({ x - 1, cnt });
cnt++;
}
x = mmp[x - 1];
if (mmp.find(y) == mmp.end()) {
mmp.insert({ y,cnt });
cnt++;
}
y = mmp[y];
if (tag == "odd") {//奇数
int ux = find(x);
int uy = find(y);
if (ux == uy && f[x].length % 2 == f[y].length % 2)
{
cout << i << endl;
flag = 1;
continue;
}
else {
if (ux != uy) {
f[uy].fa = ux;
f[uy].length = f[x].length + 1 + f[y].length;
}
}
}
else {
int ux = find(x);
int uy = find(y);
if (ux == uy && f[x].length % 2 != f[y].length % 2)
{
cout << i << endl;
flag = 1;
continue;
}
else {
if (ux != uy) {
f[uy].fa = ux;
f[uy].length = f[x].length + f[y].length;
}
}
}
}
if (flag == 0)
cout << k << endl;
}