#include <bits/stdc++.h>
using namespace std;
vector<int> v[300005];
int n, m, s;
int edgeck[300005], Etype[300005];
pair<int, int> E[300005];
int vis[300005];
void bfs() {
  memset(vis, 0, sizeof(vis));
  queue<int> que;
  que.push(s);
  while (!que.empty()) {
    int now = que.front();
    que.pop();
    vis[now] = 1;
    for (int i = 0; i < v[now].size(); i++) {
      int Enum = v[now][i];
      int nxt = -1;
      if (edgeck[Enum] == -1) {
        nxt = E[Enum].second;
        if (nxt != now) {
          edgeck[Enum] = 0;
        } else {
          nxt = E[Enum].first;
          edgeck[Enum] = 1;
        }
        if (!vis[nxt]) {
          vis[nxt] = 1;
          que.push(nxt);
        }
      } else {
        nxt = (edgeck[Enum] == 0 ? E[Enum].second : E[Enum].first);
        if (vis[nxt]) continue;
        vis[nxt] = 1;
        que.push(nxt);
      }
    }
  }
  for (int i = 0; i < m; i++) {
    if (edgeck[i] == -1) edgeck[i] = 0;
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (vis[i]) ++cnt;
  }
  printf("%d\n", cnt);
  for (int i = 0; i < m; i++) {
    if (Etype[i] != 2) continue;
    if (edgeck[i] == 0)
      printf("+");
    else
      printf("-");
  }
  puts("");
}
void bfs2() {
  memset(vis, 0, sizeof(vis));
  queue<int> que;
  que.push(s);
  while (!que.empty()) {
    int now = que.front();
    que.pop();
    vis[now] = 1;
    for (int i = 0; i < v[now].size(); i++) {
      int Enum = v[now][i];
      int nxt = -1;
      if (edgeck[Enum] == -1) {
        nxt = E[Enum].second;
        if (nxt != now) {
          edgeck[Enum] = 1;
        } else {
          nxt = E[Enum].first;
          edgeck[Enum] = 0;
        }
      } else {
        nxt = (edgeck[Enum] == 0 ? E[Enum].second : E[Enum].first);
        if (vis[nxt]) continue;
        vis[nxt] = 1;
        que.push(nxt);
      }
    }
  }
  for (int i = 0; i < m; i++) {
    if (edgeck[i] == -1) edgeck[i] = 0;
  }
  int cnt = 0;
  for (int i = 1; i <= n; i++) {
    if (vis[i]) ++cnt;
  }
  printf("%d\n", cnt);
  for (int i = 0; i < m; i++) {
    if (Etype[i] != 2) continue;
    if (edgeck[i] == 0)
      printf("+");
    else
      printf("-");
  }
  puts("");
}
int main() {
  memset(edgeck, -1, sizeof(edgeck));
  scanf("%d %d %d", &n, &m, &s);
  for (int ty, a, b, i = 0; i < m; i++) {
    scanf("%d %d %d", &ty, &a, &b);
    v[a].push_back(i);
    v[b].push_back(i);
    if (ty == 1) {
      edgeck[i] = 0;
    } else {
      Etype[i] = 2;
    }
    E[i] = {a, b};
  }
  bfs();
  for (int i = 0; i < m; i++) {
    if (Etype[i] != 2) continue;
    edgeck[i] = -1;
  }
  bfs2();
}
