#include <bits/stdc++.h>
using namespace std;
const int MAXN = 3e5 + 5;
struct edge {
  int t, u, w, idx;
} E[MAXN];
struct node {
  int to, idx;
};
vector<node> dir[MAXN], udir[MAXN];
int N, M, s, vis[MAXN], maximum, minimum;
char mx[MAXN], mn[MAXN];
void solve_max(int u) {
  maximum++;
  vis[u] = 1;
  for (node it : dir[u])
    if (!vis[it.to]) solve_max(it.to);
  for (node it : udir[u]) {
    if (vis[it.to]) continue;
    if (it.idx < 0)
      mx[abs(it.idx)] = '-';
    else
      mx[abs(it.idx)] = '+';
    solve_max(it.to);
  }
}
void solve_min(int u) {
  vis[u] = 1;
  minimum++;
  for (node it : dir[u])
    if (!vis[it.to]) solve_min(it.to);
  for (node it : udir[u]) {
    if (vis[it.to]) continue;
    if (it.idx < 0)
      mn[abs(it.idx)] = '+';
    else
      mn[abs(it.idx)] = '-';
  }
}
int main() {
  scanf("%d %d %d", &N, &M, &s);
  vector<int> pos;
  for (int i = 1; i <= M; ++i) {
    int t, u, v;
    scanf("%d %d %d", &t, &u, &v);
    if (t == 1)
      dir[u].push_back((node){v, i});
    else {
      pos.push_back(i);
      udir[u].push_back((node){v, i});
      udir[v].push_back((node){u, -i});
    }
  }
  for (int i = 0; i < MAXN; ++i) mx[i] = mn[i] = '-';
  solve_max(s);
  memset(vis, 0, sizeof(vis));
  solve_min(s);
  printf("%d\n", maximum);
  for (int i : pos) printf("%c", mx[i]);
  printf("\n%d\n", minimum);
  for (int i : pos) printf("%c", mn[i]);
  return 0;
}
