#include <bits/stdc++.h>
using namespace std;
#pragma GCC optimize("O3")
#pragma GCC optimize("O2")
int n, m, u, ans;
int type[400000], start[400000], finish[400000], t[400000], use[400000];
vector<pair<int, int> > vec[400000];
void solve1(int u) {
  ans++;
  use[u] = 1;
  for (auto to : vec[u]) {
    int in = to.second;
    int v = to.first;
    if (!use[v]) {
      if (u != start[in]) type[in] = 1;
      solve1(v);
    }
  }
}
void solve2(int u) {
  ans++;
  use[u] = 1;
  for (auto to : vec[u]) {
    int in = to.second;
    int v = to.first;
    if (!use[v]) {
      if (t[in] == 1)
        solve2(v);
      else {
        if (u == start[in]) type[in] = 1;
      }
    }
  }
}
signed main() {
  cin >> n >> m >> u;
  for (int i = 1; i <= m; i++) {
    cin >> t[i] >> start[i] >> finish[i];
    if (t[i] == 1) {
      vec[start[i]].push_back({finish[i], i});
    } else {
      vec[start[i]].push_back({finish[i], i});
      vec[finish[i]].push_back({start[i], i});
    }
  }
  solve1(u);
  cout << ans << '\n';
  for (int i = 1; i <= m; i++)
    if (t[i] == 2 && type[i])
      cout << '-';
    else if (t[i] == 2)
      cout << '+';
  cout << '\n';
  for (int i = 1; i <= n; i++) use[i] = 0;
  for (int i = 1; i <= m; i++) type[i] = 0;
  ans = 0;
  solve2(u);
  cout << ans << '\n';
  for (int i = 1; i <= m; i++)
    if (t[i] == 2 && type[i])
      cout << '-';
    else if (t[i] == 2)
      cout << '+';
  cout << '\n';
}
