#include <bits/stdc++.h>
using namespace std;
using ll = long long;
vector<pair<ll, ll>> adj[500005];
ll origdest[500005];
ll dest[500005];
ll visited[500005];
void dfs(ll cur, ll dir) {
  if (visited[cur]) return;
  visited[cur] = true;
  for (auto &p : adj[cur]) {
    if (p.second == -1) {
      dfs(p.first, dir);
    } else if (dest[p.second] == -1) {
      if (dir == 1) {
        dest[p.second] = p.first;
        dfs(p.first, dir);
      } else {
        dest[p.second] = cur;
      }
    }
  }
}
int main() {
  ll n, m, s, f = 0;
  cin >> n >> m >> s;
  s -= 1;
  for (ll i = (0); i < ll(m); i++) {
    ll t, u, v;
    cin >> t >> u >> v;
    u -= 1;
    v -= 1;
    if (t == 1) {
      adj[u].emplace_back(v, -1);
    } else {
      adj[u].emplace_back(v, f);
      adj[v].emplace_back(u, f);
      origdest[f] = v;
      f += 1;
    }
  }
  memset(dest, -1, sizeof(dest));
  memset(visited, 0, sizeof(visited));
  dfs(s, 1);
  ll numv = 0;
  for (ll i = (0); i < ll(n); i++)
    if (visited[i]) numv += 1;
  cout << numv << endl;
  for (ll i = (0); i < ll(f); i++) {
    if (dest[i] == origdest[i])
      cout << "+";
    else
      cout << "-";
  }
  cout << endl;
  memset(dest, -1, sizeof(dest));
  memset(visited, 0, sizeof(visited));
  dfs(s, 0);
  numv = 0;
  for (ll i = (0); i < ll(n); i++)
    if (visited[i]) numv += 1;
  cout << numv << endl;
  for (ll i = (0); i < ll(f); i++) {
    if (dest[i] == origdest[i])
      cout << "+";
    else
      cout << "-";
  }
  cout << endl;
}
