#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0;
  bool f = 0;
  char c = getchar();
  while (c < '0' || c > '9') f |= c == '-', c = getchar();
  while (c >= '0' && c <= '9') x = x * 10 + (c ^ 48), c = getchar();
  return f ? -x : x;
}
int N, M;
struct Edge {
  int u, v, c;
} E[100000 + 5];
struct DSU {
  int fa[1000 + 5];
  DSU() {}
  DSU(int n) {
    for (int i = 1; i <= n; i++) fa[i] = i;
  }
  int Find(int x) { return fa[x] == x ? x : fa[x] = Find(fa[x]); }
  bool Same(int x, int y) { return Find(x) == Find(y); }
  void Union(int x, int y) { fa[Find(x)] = Find(y); }
};
set<int> Ans;
int Kruskal(int id) {
  DSU tmp(N);
  tmp.Union(E[id].u, E[id].v);
  for (int i : Ans) {
    int u = E[i].u, v = E[i].v;
    if (!tmp.Same(u, v))
      tmp.Union(u, v);
    else if (E[i].c)
      return i;
  }
  return -1;
}
void Output(bool sign) {
  printf("%d\n", Ans.size());
  for (int i : Ans)
    if (sign)
      printf("(%d %d %c)\n", E[i].u, E[i].v, E[i].c ? 'S' : 'M');
    else
      printf("%d ", i);
}
int main() {
  N = read(), M = read();
  for (int i = 1; i <= M; i++) {
    int u = read(), v = read();
    char str[10];
    scanf("%s", str);
    E[i].u = u, E[i].v = v, E[i].c = str[0] == 'S';
  }
  if ((N - 1) & 1) return puts("-1"), 0;
  DSU C(N);
  int cnt0 = 0, cnt1 = 0, Half = (N - 1) / 2;
  for (int i = 1; i <= M; i++) {
    int u = E[i].u, v = E[i].v;
    if (E[i].c && !C.Same(u, v)) {
      cnt1++;
      C.Union(u, v);
      Ans.insert(i);
    }
  }
  for (int i = 1; i <= M; i++) {
    if (E[i].c) continue;
    int u = E[i].u, v = E[i].v;
    if (!C.Same(u, v)) {
      cnt0++;
      C.Union(u, v);
      Ans.insert(i);
    }
  }
  for (int i = 1; i <= M && cnt0 < Half; i++) {
    if (E[i].c) continue;
    int u = E[i].u, v = E[i].v;
    int id = Kruskal(i);
    if (id != -1) {
      cnt1--, cnt0++;
      Ans.erase(id), Ans.insert(i);
    }
  }
  if (cnt0 == Half && cnt1 == Half)
    Output(0);
  else
    puts("-1");
}
