#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
map<pair<int, int>, bool> type1, type2, taken;
map<pair<int, int>, vector<int> > ind2;
const int N = 3e5 + 5;
char ans1[N], ans2[N];
vector<int> adj[N], adjDir[N];
int t, n, m, u, v, mx, mn;
bool visited[N];
void dfs(int node) {
  visited[node] = 1, mx++;
  for (int i = 0; i < adj[node].size(); i++) {
    int ch = adj[node][i];
    if (!visited[ch]) {
      if (type2[{node, ch}]) {
        int second = ind2[{node, ch}].size();
        for (int j = 0; j < second; j++) {
          ans2[ind2[{node, ch}][j]] = '+';
        }
      } else {
        int second = ind2[{ch, node}].size();
        for (int j = 0; j < second; j++) {
          ans2[ind2[{ch, node}][j]] = '-';
        }
      }
      dfs(ch);
    }
  }
  for (int i = 0; i < adjDir[node].size(); i++) {
    int ch = adjDir[node][i];
    if (!visited[ch]) dfs(ch);
  }
}
void dfs2(int node) {
  visited[node] = 1, mn++;
  int s1 = adj[node].size();
  for (int i = 0; i < s1; i++) {
    int ch = adj[node][i];
    if (!visited[ch]) {
      if (type2[{node, ch}]) {
        if (!taken[{node, ch}]) {
          taken[{node, ch}] = 1;
          int second = ind2[{node, ch}].size();
          for (int j = 0; j < second; j++) {
            ans1[ind2[{node, ch}][j]] = '-';
          }
        }
      } else {
        if (!taken[{ch, node}]) {
          taken[{ch, node}] = 1;
          int second = ind2[{ch, node}].size();
          for (int j = 0; j < second; j++) {
            ans1[ind2[{ch, node}][j]] = '+';
          }
        }
      }
    }
  }
  int second = adjDir[node].size();
  for (int i = 0; i < second; i++) {
    int ch = adjDir[node][i];
    if (!visited[ch]) dfs2(ch);
  }
}
int main() {
  int c = 1, second;
  scanf("%d%d%d", &n, &m, &second);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &t, &u, &v);
    if (t == 1) {
      type1[{u, v}] = 1;
      adjDir[u].push_back(v);
    } else {
      type2[{u, v}] = 1, ind2[{u, v}].push_back(c++);
      adj[v].push_back(u), adj[u].push_back(v);
    }
  }
  for (int i = 1; i < c; i++) {
    ans1[i] = '+', ans2[i] = '+';
  }
  dfs(second);
  memset(visited, 0, sizeof visited);
  dfs2(second);
  printf("%d\n", mx);
  for (int i = 1; i < c; i++) printf("%c", ans2[i]);
  printf("\n");
  printf("%d\n", mn);
  for (int i = 1; i < c; i++) printf("%c", ans1[i]);
  printf("\n");
  return 0;
}
