#include <bits/stdc++.h>
using namespace std;
const int Maxn = 1000 + 5, Maxm = 100 * 1000 + 5;
int n, m, cnt[2], ind, par[Maxn], adjj[Maxn][Maxn];
vector<pair<int, int> > e[2];
vector<int> adj[Maxn], num[Maxn], type[Maxn], adj2[Maxn], num2[Maxn], numm[2];
bool marke[Maxm], markv[Maxn];
void rep(int x, int y) {
  vector<int> vec, vec2;
  int i = (int)adj2[x].size() - 1;
  while (adj2[x][i] != y) {
    vec.push_back(adj2[x][i]);
    adj2[x].pop_back();
    vec2.push_back(num2[x][i]);
    num2[x].pop_back();
    i--;
  }
  adj2[x].pop_back();
  marke[num2[x][i]] = false;
  num2[x].pop_back();
  for (int j = 0; j < (int)vec.size(); j++) {
    adj2[x].push_back(vec[j]);
    num2[x].push_back(vec2[j]);
  }
  return;
}
void add(int a) {
  int x = e[ind][a].first, y = e[ind][a].second;
  adj2[x].push_back(y);
  adj2[y].push_back(x);
  num2[x].push_back(numm[ind][a]);
  num2[y].push_back(numm[ind][a]);
  marke[numm[ind][a]] = true;
  adjj[x][y] = adjj[y][x] = ind;
  return;
}
void dfs2(int v) {
  markv[v] = true;
  for (int i = 0; i < (int)adj2[v].size(); i++)
    if (!markv[adj2[v][i]]) {
      par[adj2[v][i]] = v;
      dfs2(adj2[v][i]);
    }
  return;
}
void dfs(int v) {
  markv[v] = true;
  for (int i = 0; i < (int)adj[v].size(); i++) {
    if (!markv[adj[v][i]]) {
      if (type[v][i] == 0)
        cnt[0]++;
      else {
        cnt[1]++;
        adjj[v][adj[v][i]] = adjj[adj[v][i]][v] = 1;
      }
      adj2[v].push_back(adj[v][i]);
      adj2[adj[v][i]].push_back(v);
      num2[v].push_back(num[v][i]);
      num2[adj[v][i]].push_back(num[v][i]);
      marke[num[v][i]] = true;
      dfs(adj[v][i]);
    }
  }
  return;
}
int pp(int v) {
  if (par[v] == v) return -1;
  if (adjj[v][par[v]] == (ind ^ 1)) return v * n + par[v];
  return pp(par[v]);
}
int main() {
  ios_base::sync_with_stdio(false);
  cin >> n >> m;
  int u, v;
  char c;
  for (int i = 0; i < m; i++) {
    cin >> u >> v >> c;
    if (u != v) {
      u--;
      v--;
      adj[u].push_back(v);
      adj[v].push_back(u);
      num[u].push_back(i);
      num[v].push_back(i);
      if (c == 'S') {
        type[u].push_back(0);
        type[v].push_back(0);
        e[0].push_back(make_pair(u, v));
        numm[0].push_back(i);
      } else {
        type[u].push_back(1);
        type[v].push_back(1);
        e[1].push_back(make_pair(u, v));
        numm[1].push_back(i);
      }
    }
  }
  dfs(0);
  for (int i = 0; i < n; i++) {
    if (!markv[i]) {
      cout << -1 << endl;
      return 0;
    }
  }
  if (cnt[0] > cnt[1]) ind = 1;
  for (int i = 0; i < (int)e[ind].size(); i++) {
    if (cnt[ind] >= cnt[ind ^ 1]) break;
    if (!marke[numm[ind][i]]) {
      u = e[ind][i].first, v = e[ind][i].second;
      for (int j = 0; j < n; j++) markv[j] = false;
      par[v] = v;
      dfs2(v);
      int a = pp(u);
      if (a != -1) {
        int x = a % n, y = a / n;
        rep(x, y);
        rep(y, x);
        add(i);
        cnt[ind]++;
        cnt[ind ^ 1]--;
      }
    }
  }
  if (cnt[0] != cnt[1])
    cout << -1 << endl;
  else {
    cout << n - 1 << endl;
    for (int i = 0; i < m; i++)
      if (marke[i]) cout << i + 1 << " ";
    cout << endl;
  }
  return 0;
}
