#include <bits/stdc++.h>
using namespace std;
inline long long QuickPow(long long x, long long y) {
  long long Res = 1, Temp = x;
  while (y) {
    if (y & 1) Res = Res * Temp % 1000000007;
    Temp = Temp * Temp % 1000000007;
    y /= 2;
  }
  return Res;
}
inline void Swap(long long &x, long long &y) {
  long long Temp = x;
  x = y;
  y = Temp;
}
inline long long Max(long long x, long long y) { return x > y ? x : y; }
inline long long Min(long long x, long long y) { return x < y ? x : y; }
inline void read(long long &x) {
  x = 0;
  long long f = 1;
  char s = getchar();
  while (s < '0' || s > '9') {
    if (s == '-') f = -1;
    s = getchar();
  }
  while (s >= '0' && s <= '9') {
    x = (x << 3) + (x << 1) + (s ^ 48);
    s = getchar();
  }
  x *= f;
}
bool Color[1005];
inline void MakeSet(long long x, long long Fa[]) {
  for (register int i = 1; i <= x; ++i) Fa[i] = i;
}
long long FindSet(long long x, long long Fa[]) {
  if (Fa[x] != x) Fa[x] = FindSet(Fa[x], Fa);
  return Fa[x];
}
inline void UnionSet(long long u, long long v, long long Fa[]) { Fa[u] = v; }
struct Edge {
  long long u, v;
  bool Color;
  Edge() {}
  Edge(long long U, long long V, bool COLOR) {
    u = U;
    v = V;
    Color = COLOR;
  }
} Eg[100005];
bool Used[100005];
long long All[1005], On[1005];
int main() {
  long long n, m;
  read(n);
  read(m);
  for (register int i = 1; i <= m; ++i) {
    long long u, v;
    read(u);
    read(v);
    char S;
    scanf("%c", &S);
    Eg[i] = Edge(u, v, S == 'S' ? 0 : 1);
  }
  if (n % 2 == 0) return !printf("-1");
  MakeSet(n, On);
  MakeSet(n, All);
  long long Zero = 0, One = 0;
  for (register int i = 1; i <= m; ++i) {
    if (Eg[i].Color != 0) continue;
    long long Fu = FindSet(Eg[i].u, All);
    long long Fv = FindSet(Eg[i].v, All);
    if (Fu == Fv) continue;
    Zero++;
    UnionSet(Fu, Fv, All);
  }
  if (Zero < (n - 1) / 2) return !printf("-1");
  for (register int i = 1; i <= m; ++i) {
    if (Eg[i].Color != 1) continue;
    long long Fu = FindSet(Eg[i].u, All);
    long long Fv = FindSet(Eg[i].v, All);
    if (Fu == Fv) continue;
    One++;
    Used[i] = 1;
    UnionSet(Fu, Fv, On);
    UnionSet(Fu, Fv, All);
  }
  if (Zero + One != n - 1) return !printf("-1");
  for (register int i = 1; i <= m && One < Zero; ++i) {
    if (Eg[i].Color != 1 || Used[i]) continue;
    long long Fu = FindSet(Eg[i].u, On);
    long long Fv = FindSet(Eg[i].v, On);
    if (Fu == Fv) continue;
    One++;
    Zero--;
    Used[i] = 1;
    UnionSet(Fu, Fv, On);
  }
  if (One < Zero) return !printf("-1");
  for (register int i = 1; i <= m; ++i) {
    if (Eg[i].Color != 0) continue;
    long long Fu = FindSet(Eg[i].u, On);
    long long Fv = FindSet(Eg[i].v, On);
    if (Fu == Fv) continue;
    Used[i] = 1;
    UnionSet(Fu, Fv, On);
  }
  printf("%lld\n", n - 1);
  for (register int i = 1; i <= m; ++i)
    if (Used[i]) printf("%lld ", i);
  return 0;
}
