#include <bits/stdc++.h>
using namespace std;
using namespace std;
long long int gcd(long long int a, long long int b) {
  if (b == 0) return a;
  return gcd(b, a % b);
}
bool is(long long int i, long long int j, long long int n, long long int m) {
  if (i >= 0 && i < n && j >= 0 && j < m) return 1;
  return 0;
}
long long int cnt = 0;
map<vector<long long int>, char> sign;
void maximize(long long int u, vector<bool>& vis,
              vector<vector<vector<long long int>>>& edges) {
  vis[u] = 1;
  cnt++;
  for (auto v : edges[u]) {
    if (v[1] == 1 && v[2] == 0) {
      if (!vis[v[0]]) maximize(v[0], vis, edges);
    }
    if (v[1] == 2) {
      if (v[2] == 0 && !sign.count({u, v[0]}))
        sign[{u, v[0]}] = '+';
      else if (v[2] == 1 && !sign.count({v[0], u}))
        sign[{v[0], u}] = '-';
      if (!vis[v[0]]) maximize(v[0], vis, edges);
    }
  }
}
long long int pa = -1;
void minimize(long long int u, vector<bool>& vis,
              vector<vector<vector<long long int>>>& edges) {
  vis[u] = 1;
  cnt++;
  for (auto v : edges[u]) {
    if (v[1] == 1 && v[2] == 0) {
      if (!vis[v[0]]) {
        pa = u;
        minimize(v[0], vis, edges);
      }
    }
    if (v[1] == 2) {
      if (v[2] == 0) {
        if (!sign.count({u, v[0]})) {
          sign[{u, v[0]}] = '-';
        } else {
          if (sign[{u, v[0]}] == '+' && !vis[v[0]]) {
            pa = u;
            minimize(v[0], vis, edges);
          }
        }
      } else {
        if (!sign.count({v[0], u})) {
          sign[{v[0], u}] = '+';
        } else {
          if (sign[{v[0], u}] == '-' && !vis[v[0]]) {
            pa = u;
            minimize(v[0], vis, edges);
          }
        }
      }
    }
  }
}
signed main(void) {
  long long int t = 1;
  std::ios::sync_with_stdio(false);
  cin.tie(NULL);
  while (t--) {
    long long int n, m, s;
    cin >> n >> m >> s;
    vector<vector<vector<long long int>>> edges(n + 1);
    vector<vector<long long int>> undirected;
    for (long long int i = 0; i < m; i++) {
      long long int type, u, v;
      cin >> type >> u >> v;
      edges[u].push_back({v, type, 0});
      edges[v].push_back({u, type, 1});
      if (type == 2) undirected.push_back({u, v});
    }
    vector<bool> vis(n + 1);
    cnt = 0;
    maximize(s, vis, edges);
    cout << cnt << endl;
    for (auto p : undirected) {
      if (sign.count(p))
        cout << sign[p];
      else
        cout << '+';
    }
    cout << endl;
    sign.clear();
    for (long long int i = 1; i <= n; i++) vis[i] = 0;
    cnt = 0;
    minimize(s, vis, edges);
    cout << cnt << endl;
    for (auto p : undirected) {
      if (sign.count(p))
        cout << sign[p];
      else
        cout << '+';
    }
    cout << endl;
  }
}
