1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
//Reorganizacja [REO]
#include <cstdio>
#include <vector>
using namespace std;
int n,m,rt,ii,i,cur,cc,c[10100],d[10100],pp[10100],p[10100],x[10100],y[10100];
bool a[10100],ok[10100];
vector<int> g[1010];
char s[5];
void dfs(int i) {
  c[i]=cc;
  for (int j=0; j<g[i].size(); j++) {
    int k=g[i][j];
    if (p[k]==-1) {
      if (c[k]==0) dfs(k);
    } else if (d[k]>d[cur]) cur=k;
  }
}
int main() {
  scanf("%d%d",&n,&m);
  for (i=0; i<m; i++) {
    scanf("%d%d",&x[i],&y[i]);
    scanf("%s",s);
    if (s[0]=='T') {
      g[x[i]].push_back(y[i]);
      g[y[i]].push_back(x[i]);
      a[i]=true;
    }
  }
  for (i=1; i<=n; i++) p[i]=-1;
  for (ii=0; ii<n; ii++) {
    for (i=1; i<=n; i++) {
      c[i]=int(ii==0);
      ok[i]=true;
    }
    if (ii==0) {
      cc=1;
      pp[1]=0;
    } else for (cc=0, i=1; i<=n; i++) if (p[i]==-1 && c[i]==0) {
      cc++;
      cur=rt;
      dfs(i);
      pp[cc]=cur;
    }
    for (i=0; i<m; i++) if (c[x[i]]!=0 && c[x[i]]==c[y[i]]) {
      if (a[i]) ok[x[i]]=false; else ok[y[i]]=false;
    }
    for (i=1; i<=n; i++) if (p[i]==-1 && ok[i]) {
      p[i]=pp[c[i]];
      d[i]=d[p[i]]+1;
      if (ii==0) rt=i;
      break;
    }
    if (i>n) break;
  }
  if (ii>=n) for (i=1; i<=n; i++) printf("%d\n",p[i]); else puts("NIE");
  return 0;
}