#include <bits/stdc++.h>
#pragma warning(disable : 4996)
using namespace std;
const int maxn = 6e5 + 10;
int n, m, s;
int head[maxn], siz;
int vis[maxn];
int check[maxn];
int X[maxn], U[maxn], V[maxn];
struct node {
  int to, nxt, id;
} ed[maxn];
void add(int u, int v, int x) {
  ed[siz].id = x;
  ed[siz].to = v;
  ed[siz].nxt = head[u];
  head[u] = siz++;
}
void bfs1(int x) {
  queue<int> q;
  q.push(s);
  vis[s] = 1;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = head[x]; ~i; i = ed[i].nxt) {
      int v = ed[i].to;
      if (vis[v] == 0) {
        vis[v] = 1;
        if (ed[i].id > 0) {
          check[ed[i].id] = x;
        }
        q.push(v);
      }
    }
  }
}
void bfs2(int x) {
  queue<int> q;
  q.push(x);
  while (!q.empty()) {
    int temp = q.front();
    q.pop();
    for (int i = head[temp]; ~i; i = ed[i].nxt) {
      int v = ed[i].to;
      if (!vis[v]) {
        if (ed[i].id > 0) {
          if (check[ed[i].id] == temp) {
            vis[v] = 1;
            q.push(v);
          } else
            check[ed[i].id] = v;
        } else {
          vis[v] = 1;
          q.push(v);
        }
      }
    }
  }
}
int main() {
  while (scanf("%d%d%d", &n, &m, &s) != EOF) {
    memset(head, -1, sizeof(head));
    siz = 0;
    for (int i = 1; i <= m; i++) {
      scanf("%d%d%d", &X[i], &U[i], &V[i]);
      if (X[i] == 1) {
        add(U[i], V[i], 0);
      } else {
        add(U[i], V[i], i);
        add(V[i], U[i], i);
      }
    }
    vis[s] = 1;
    bfs1(s);
    int ans1 = 0;
    for (int i = 1; i <= n; i++) ans1 += vis[i];
    printf("%d\n", ans1);
    for (int i = 1; i <= m; i++) {
      if (X[i] == 2) {
        if (check[i] == U[i])
          printf("+");
        else
          printf("-");
      }
    }
    printf("\n");
    memset(vis, 0, sizeof(vis));
    memset(check, 0, sizeof(check));
    vis[s] = 1;
    bfs2(s);
    int ans2 = 0;
    for (int i = 1; i <= n; i++) ans2 += vis[i];
    printf("%d\n", ans2);
    for (int i = 1; i <= m; i++) {
      if (X[i] == 2) {
        if (check[i] == U[i])
          printf("+");
        else
          printf("-");
      }
    }
    printf("\n");
  }
  return 0;
}
