#include <bits/stdc++.h>
using namespace std;
const int maxn = 500010;
int n, m, s;
int ans, cnt, h;
int color[maxn];
int head[maxn];
struct node {
  int y;
  int id;
};
vector<node> g[maxn];
bool vis[maxn];
int bfs1(int x) {
  queue<int> Q;
  Q.push(x);
  memset(vis, 0, sizeof(vis));
  ans = 1;
  vis[x] = true;
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    for (int i = 0; i < g[x].size(); i++) {
      int y = g[x][i].y;
      int id = g[x][i].id;
      if (vis[y]) {
        continue;
      }
      if (id != -1) {
        color[id / 2] = (id % 2);
      }
      Q.push(y);
      vis[y] = true;
      ans++;
    }
  }
  return ans;
}
int bfs2(int x) {
  queue<int> Q;
  Q.push(x);
  memset(vis, 0, sizeof(vis));
  ans = 1;
  vis[x] = true;
  while (!Q.empty()) {
    int x = Q.front();
    Q.pop();
    for (int i = 0; i < g[x].size(); i++) {
      int y = g[x][i].y;
      int id = g[x][i].id;
      if (vis[y]) {
        continue;
      }
      if (id != -1) {
        color[id / 2] = 1 ^ (id % 2);
        continue;
      }
      Q.push(y);
      vis[y] = true;
      ans++;
    }
  }
  return ans;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    int t, u, v;
    cin >> t >> u >> v;
    if (t == 1) {
      g[u].push_back(node{v, -1});
    } else {
      g[u].push_back(node{v, h});
      g[v].push_back(node{u, h + 1});
      h += 2;
    }
  }
  cout << bfs1(s) << '\n';
  for (int i = 0; i < h / 2; i++) {
    if (color[i])
      cout << '-';
    else
      cout << '+';
  }
  cout << '\n';
  cout << bfs2(s) << '\n';
  for (int i = 0; i < h / 2; i++) {
    if (color[i])
      cout << '-';
    else
      cout << '+';
  }
  return 0;
}
