#include <bits/stdc++.h>
using namespace std;
const int maxn = 3 * 1e5 + 100;
int n, m, s, tot;
int head[maxn], type[maxn];
bool vis[maxn];
bool ans[maxn];
struct Edge {
  int u, v, next, id;
  bool use;
} edge[maxn * 2];
inline void add(int u, int v, int id) {
  edge[tot].v = v;
  edge[tot].u = u;
  edge[tot].id = id;
  edge[tot].use = true;
  edge[tot].next = head[u];
  head[u] = tot++;
}
inline void Init() {
  tot = 0;
  memset(head, -1, sizeof(head));
}
void bfs(int be, bool flag) {
  memset(vis, false, sizeof(vis));
  queue<int> q;
  q.push(be);
  vis[be] = true;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int i = head[u]; i != -1; i = edge[i].next) {
      int v = edge[i].v;
      if (!vis[v] && edge[i].use && edge[i ^ 1].use) {
        if (edge[i ^ 1].v != edge[i].v) {
          if (flag) {
            ans[edge[i].id] = (i < (i ^ 1)) ? true : false;
            edge[i ^ 1].use = false;
            q.push(v);
            vis[v] = true;
          } else {
            ans[edge[i].id] = (i < (i ^ 1)) ? false : true;
            edge[i].use = false;
          }
        } else {
          q.push(v);
          vis[v] = true;
        }
      }
    }
  }
}
int main() {
  Init();
  cin >> n >> m >> s;
  int u, v;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &type[i], &u, &v);
    if (type[i] == 1) {
      add(u, v, i);
      add(u, v, i);
    } else {
      add(u, v, i);
      add(v, u, i);
    }
  }
  int sum = 0;
  memset(ans, false, sizeof(ans));
  bfs(s, true);
  for (int i = 1; i <= n; ++i) {
    if (vis[i]) sum++;
  }
  cout << sum << endl;
  for (int i = 1; i <= m; ++i) {
    if (type[i] == 2) {
      if (ans[i])
        cout << '+';
      else
        cout << '-';
    }
  }
  cout << endl;
  for (int i = 0; i <= tot; ++i) {
    edge[i].use = true;
  }
  memset(ans, false, sizeof(ans));
  bfs(s, false);
  sum = 0;
  for (int i = 1; i <= n; ++i) {
    if (vis[i]) sum++;
  }
  cout << sum << endl;
  for (int i = 1; i <= m; ++i) {
    if (type[i] == 2) {
      if (ans[i])
        cout << '+';
      else
        cout << '-';
    }
  }
  cout << endl;
  return 0;
}
