#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, const U &b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, const U &b) {
  if (a < b) a = b;
}
template <class T>
inline void gn(T &first) {
  char c, sg = 0;
  while (c = getchar(), (c > '9' || c < '0') && c != '-')
    ;
  for ((c == '-' ? sg = 1, c = getchar() : 0), first = 0; c >= '0' && c <= '9';
       c = getchar())
    first = (first << 1) + (first << 3) + c - '0';
  if (sg) first = -first;
}
template <class T1, class T2>
inline void gn(T1 &x1, T2 &x2) {
  gn(x1), gn(x2);
}
template <class T1, class T2, class T3>
inline void gn(T1 &x1, T2 &x2, T3 &x3) {
  gn(x1, x2), gn(x3);
}
template <class T1, class T2, class T3, class T4>
inline void gn(T1 &x1, T2 &x2, T3 &x3, T4 &x4) {
  gn(x1, x2, x3), gn(x4);
}
template <class T1, class T2, class T3, class T4, class T5>
inline void gn(T1 &x1, T2 &x2, T3 &x3, T4 &x4, T5 &x5) {
  gn(x1, x2, x3, x4), gn(x5);
}
template <class T>
inline void print(T first) {
  if (first < 0) {
    putchar('-');
    return print(-first);
  }
  if (first < 10) {
    putchar('0' + first);
    return;
  }
  print(first / 10);
  putchar(first % 10 + '0');
}
template <class T>
inline void println(T first) {
  print(first);
  putchar('\n');
}
template <class T>
inline void printsp(T first) {
  print(first);
  putchar(' ');
}
template <class T1, class T2>
inline void print(T1 x1, T2 x2) {
  printsp(x1), println(x2);
}
template <class T1, class T2, class T3>
inline void print(T1 x1, T2 x2, T3 x3) {
  printsp(x1), printsp(x2), println(x3);
}
template <class T1, class T2, class T3, class T4>
inline void print(T1 x1, T2 x2, T3 x3, T4 x4) {
  printsp(x1), printsp(x2), printsp(x3), println(x4);
}
template <class T1, class T2, class T3, class T4, class T5>
inline void print(T1 x1, T2 x2, T3 x3, T4 x4, T5 x5) {
  printsp(x1), printsp(x2), printsp(x3), printsp(x4), println(x5);
}
int power(int a, int b, int m, int ans = 1) {
  for (; b; b >>= 1, a = 1LL * a * a % m)
    if (b & 1) ans = 1LL * ans * a % m;
  return ans;
}
vector<pair<int, int> > adj[100100];
vector<int> sz[3];
long long st[100100];
int flag[100100];
int vst = 0;
vector<int> val;
vector<int> ans;
void dfs(int u, int tp) {
  if (vst) return;
  sz[st[u]].push_back(u);
  for (int i = 0; i < adj[u].size(); i++) {
    int v = adj[u][i].first;
    int stt = adj[u][i].second;
    if (flag[v]) {
      if (stt == tp and st[u] != st[v]) {
        vst = 1;
        return;
      }
      if (stt != tp and st[u] == st[v]) {
        vst = 1;
        return;
      }
      continue;
    }
    if (stt == tp)
      st[v] = st[u];
    else
      st[v] = st[u] ^ 1;
    flag[v] = 1;
    dfs(v, tp);
  }
}
int main() {
  int n, m;
  gn(n, m);
  for (int i = 1; i <= m; i++) {
    int u, v, c;
    char s;
    gn(u, v);
    cin >> s;
    if (s == 'R')
      c = 1;
    else
      c = 0;
    adj[u].push_back(pair<int, int>(v, c));
    adj[v].push_back(pair<int, int>(u, c));
  }
  int tp;
  int mn = -1;
  for (tp = 0; tp < 2; tp++) {
    for (int i = 1; i <= n; i++) flag[i] = 0;
    vst = 0;
    val.clear();
    for (int i = 1; i <= n; i++)
      if (flag[i] == 0) {
        sz[1].clear();
        sz[0].clear();
        flag[i] = 1;
        st[i] = 0;
        dfs(i, tp);
        if (vst) break;
        int stt = sz[1].size() > sz[0].size() ? 0 : 1;
        for (int j = 0; j < sz[stt].size(); j++) val.push_back(sz[stt][j]);
      }
    if (vst) continue;
    if (mn == -1 || ans.size() > val.size()) {
      mn = 1;
      ans.clear();
      for (int i = 0; i < val.size(); i++) ans.push_back(val[i]);
    }
  }
  if (ans.size() || mn != -1) {
    cout << ans.size() << endl;
    for (int i = 0; i < ans.size(); i++) printsp(ans[i]);
  } else
    puts("-1");
}
