#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool getmin(T *a, const T &b) {
  if (b < *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline bool getmax(T *a, const T &b) {
  if (b > *a) {
    *a = b;
    return true;
  }
  return false;
}
template <class T>
inline void read(T *a) {
  char c;
  while (isspace(c = getchar())) {
  }
  bool flag = 0;
  if (c == '-')
    flag = 1, *a = 0;
  else
    *a = c - 48;
  while (isdigit(c = getchar())) *a = *a * 10 + c - 48;
  if (flag) *a = -*a;
}
const int mo = 1000000007;
template <class T>
T pow(T a, T b, int c = mo) {
  T res = 1;
  for (T i = 1; i <= b; i <<= 1, a = 1LL * a * a % c)
    if (b & i) res = 1LL * res * a % c;
  return res;
}
const int inf = 1000000000;
const int N = 210000;
struct node {
  int p, nextt, w;
} edge[N];
int cnt;
int head[N];
void ae(int a, int b, int c) {
  edge[++cnt].p = b;
  edge[cnt].nextt = head[a];
  edge[cnt].w = c;
  head[a] = cnt;
}
queue<int> q;
int d[N], tmp[N];
int n, m;
int bfs(int u) {
  static vector<int> v;
  v.clear();
  d[u] = 0;
  while (!q.empty()) q.pop();
  q.push(u);
  int ans = 0, num = 0;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    ans += d[u];
    v.push_back(u);
    ++num;
    for (int k = head[(u)]; k; k = edge[k].nextt) {
      int v = edge[k].p;
      if (d[v] != -1 && (d[u] ^ d[v]) != edge[k].w)
        return inf;
      else if (d[v] == -1) {
        d[v] = (d[u] ^ edge[k].w);
        q.push(v);
      }
    }
  }
  for (int i = (0); i <= (num - 1); ++i)
    if (num - ans < ans) d[v[i]] ^= 1;
  return min(ans, num - ans);
}
int solve() {
  for (int i = (1); i <= (n); ++i) d[i] = -1;
  int ans = 0;
  for (int i = (1); i <= (n); ++i)
    if (d[i] == -1) {
      int x = bfs(i);
      if (x == inf)
        return inf;
      else
        ans += x;
    }
  return ans;
}
int main() {
  cin >> n >> m;
  for (int i = (1); i <= (m); ++i) {
    int x, y;
    string s;
    cin >> x >> y >> s;
    int z = 0;
    if (s == "R") z = 1;
    ae(x, y, z);
    ae(y, x, z);
  }
  int ans = solve();
  for (int i = (1); i <= (n); ++i) tmp[i] = d[i];
  for (int i = (1); i <= (n); ++i)
    for (int k = head[(i)]; k; k = edge[k].nextt) edge[k].w ^= 1;
  int x = solve();
  if (x < ans) {
    ans = x;
    for (int i = (1); i <= (n); ++i) tmp[i] = d[i];
  }
  if (ans == inf) {
    cout << -1 << endl;
  } else {
    cout << ans << endl;
    for (int i = (1); i <= (n); ++i)
      if (tmp[i]) printf("%d ", i);
    cout << endl;
  }
  return 0;
}
