#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000,100000000")
long long max(long long x, long long y) { return x > y ? x : y; }
long long min(long long x, long long y) { return x < y ? x : y; }
using namespace std;
const long long N = 1e3 + 9;
struct Edge {
  long long x, y, in;
};
vector<Edge> red, blue;
long long n, m;
long long flag[N];
vector<long long> ans;
string t;
struct Dsu {
  long long h[N] = {}, pr[N], n, cnt;
  Dsu(long long m) {
    n = m, cnt = m;
    for (long long i = 0; i < N; i++) pr[i] = i;
  }
  long long find(long long x) { return (pr[x] == x ? x : pr[x] = find(pr[x])); }
  long long join(long long u, long long w) {
    long long pu = find(u), pw = find(w);
    if (pu == pw) return false;
    if (h[pu] < h[pw]) swap(u, w), swap(pu, pw);
    h[pu] += (h[pu] == h[pw]);
    pr[pw] = pu;
    cnt--;
    return true;
  }
};
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  Dsu dr(n), db(n);
  vector<Edge> red, blue;
  Edge edge;
  char t[2];
  for (long long i = 0; i < m; i++) {
    cin >> edge.x >> edge.y >> t;
    edge.in = i + 1;
    if (t[0] == 'S') {
      red.push_back(edge);
    } else {
      blue.push_back(edge);
    }
  }
  if (n % 2 == 0) {
    cout << -1 << endl;
    exit(0);
  }
  for (auto it : red) dr.join(it.x, it.y);
  for (auto it : blue)
    if (dr.join(it.x, it.y)) {
      db.join(it.x, it.y);
      ans.push_back(it.in);
    }
  for (long long i = 0; i < blue.size() && ans.size() < (n - 1) / 2; ++i) {
    if (db.join(blue[i].x, blue[i].y)) ans.push_back(blue[i].in);
  }
  if (ans.size() != (n - 1) / 2) {
    cout << -1;
    exit(0);
  }
  for (auto it : red) {
    if (db.join(it.x, it.y)) {
      ans.push_back(it.in);
    }
  }
  if (ans.size() == n - 1) {
    cout << ans.size() << endl;
    for (auto it : ans) cout << it << ' ';
  } else
    cout << -1;
}
