#include <bits/stdc++.h>
using namespace std;
const int N = 3e5 + 10;
list<int> adj[N], adjf[N], adjb[N];
pair<int, int> ed[N];
int vis[N];
char dir[N];
int dfs(int u) {
  if (vis[u]) return 0;
  vis[u] = 1;
  int sz = 1;
  for (int v : adj[u]) sz += dfs(v);
  return sz;
}
void dfs2(int u) {
  if (vis[u]) return;
  vis[u] = 1;
  for (int v : adj[u]) dfs2(v);
  for (int i : adjf[u]) {
    if (dir[i] != 0) continue;
    dir[i] = '+';
    dfs2(ed[i].second);
  }
  for (int i : adjb[u]) {
    if (dir[i] != 0) continue;
    dir[i] = '-';
    dfs2(ed[i].first);
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  int n, m, s;
  cin >> n >> m >> s;
  s--;
  int num = 0;
  for (int i = 0; i < m; i++) {
    int u, v, t;
    cin >> t >> u >> v;
    u--, v--;
    if (t == 1) {
      adj[u].push_back(v);
    } else {
      ed[num] = make_pair(u, v);
      adjf[u].push_back(num);
      adjb[v].push_back(num);
      num++;
    }
  }
  dfs2(s);
  int ans = 0;
  for (int i = 0; i < n; i++) {
    ans += vis[i];
  }
  for (int i = 0; i < num; i++)
    if (dir[i] == 0) dir[i] = '+';
  cout << ans << '\n' << dir << '\n';
  memset(vis, 0, sizeof vis);
  cout << dfs(s) << '\n';
  for (int i = 0; i < num; i++) {
    int u = ed[i].first, v = ed[i].second;
    dir[i] = '-';
    if (!vis[u] && vis[v]) dir[i] = '+';
  }
  cout << dir << '\n';
  return 0;
}
