#include <bits/stdc++.h>
using namespace std;
struct DSU {
  vector<int> parent;
  DSU(int _n = 0) { parent = vector<int>(_n + 1, -1); }
  int find(int v) {
    if (parent[v] < 0) {
      return v;
    }
    return parent[v] = find(parent[v]);
  }
  bool combine(int u, int v) {
    u = find(u);
    v = find(v);
    if (u == v) {
      return false;
    }
    if (parent[u] > parent[v]) {
      swap(u, v);
    }
    parent[u] += parent[v];
    parent[v] = u;
    return true;
  }
};
const int N = 1005;
const int M = 100005;
vector<int> g[N];
int a[M], b[M], type[M];
int depth[N], parent[N];
void dfs(int v) {
  for (int i : g[v]) {
    int u = a[i] ^ b[i] ^ v;
    if (depth[u] == 0) {
      depth[u] = depth[v] + 1;
      parent[u] = i;
      dfs(u);
    }
  }
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(NULL);
  int n, m;
  cin >> n >> m;
  vector<int> A, B;
  for (int i = 1; i <= m; i++) {
    char ch;
    cin >> a[i] >> b[i] >> ch;
    if (ch == 'S') {
      type[i] = 0;
      A.push_back(i);
    } else {
      type[i] = 1;
      B.push_back(i);
    }
  }
  if (n % 2 == 0) {
    cout << -1 << '\n';
    exit(0);
  }
  DSU dsuMain(n);
  DSU dsuSide(n);
  set<int> chosenA, chosenB;
  int requiredA = (n - 1) >> 1;
  for (int i : A) {
    if (dsuMain.combine(a[i], b[i])) {
      chosenA.insert(i);
      requiredA--;
    }
  }
  if (requiredA > 0) {
    cout << -1 << '\n';
    exit(0);
  }
  int requiredB = (n - 1) >> 1;
  for (int i : B) {
    if (requiredB == 0) break;
    if (dsuMain.combine(a[i], b[i])) {
      dsuSide.combine(a[i], b[i]);
      chosenB.insert(i);
      requiredB--;
    } else if (requiredA < 0) {
      int u = a[i];
      int v = b[i];
      int ru = dsuSide.find(u);
      int rv = dsuSide.find(v);
      if (ru == rv) continue;
      for (int j = 1; j <= n; j++) {
        g[j].clear();
        depth[j] = 0;
      }
      for (int j : chosenA) {
        g[a[j]].push_back(j);
        g[b[j]].push_back(j);
      }
      for (int j : chosenB) {
        g[a[j]].push_back(j);
        g[b[j]].push_back(j);
      }
      for (int j = 1; j <= n; j++) {
        if (depth[j] == 0) {
          depth[j] = 1;
          dfs(j);
        }
      }
      int ind = -1;
      while (u != v) {
        if (depth[u] >= depth[v]) {
          int j = parent[u];
          if (type[j] == 0) {
            ind = j;
            break;
          }
          u ^= a[j] ^ b[j];
        } else {
          int j = parent[v];
          if (type[j] == 0) {
            ind = j;
            break;
          }
          v ^= a[j] ^ b[j];
        }
      }
      assert(ind != -1);
      chosenA.erase(ind);
      chosenB.insert(i);
      dsuSide.combine(ru, rv);
      requiredA++;
      requiredB--;
    }
  }
  if (requiredA != 0 || requiredB != 0) {
    cout << -1 << '\n';
  } else {
    cout << n - 1 << '\n';
    for (int i : chosenA) {
      cout << i << " ";
    }
    for (int i : chosenB) {
      cout << i << " ";
    }
    cout << '\n';
  }
  return 0;
}
