#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
int t[300020], u[300020], v[300020];
vector<int> e[300020];
int q[300020], o[300020];
bool k[300020];
void Maximize(int m, int s) {
  int l, r;
  int i, j, y;
  memset(o, 0, sizeof(o));
  memset(k, false, sizeof(k));
  k[s] = true;
  q[r = 1, l = 0] = s;
  for (; l < r; l++)
    for (i = 0; i < (signed)e[q[l]].size(); i++) {
      j = e[q[l]].at(i);
      if (t[j] == 1) {
        if (!k[v[j]]) {
          k[v[j]] = true;
          q[r++] = v[j];
        }
      } else if (!o[j]) {
        y = u[j] == q[l] ? v[j] : u[j];
        if (!k[y]) {
          o[j] = (u[j] != q[l]) + 1;
          k[y] = true;
          q[r++] = y;
        }
      }
    }
  printf("%d\n", r);
  for (i = 0; i < m; i++)
    if (t[i] == 2) printf("%c", o[i] == 2 ? '-' : '+');
  printf("\n");
  return;
}
void Minimize(int m, int s) {
  int l, r;
  int i, j, y;
  memset(o, 0, sizeof(o));
  memset(k, false, sizeof(k));
  k[s] = true;
  q[r = 1, l = 0] = s;
  for (; l < r; l++)
    for (i = 0; i < (signed)e[q[l]].size(); i++) {
      j = e[q[l]].at(i);
      if (t[j] == 1) {
        if (!k[v[j]]) {
          k[v[j]] = true;
          q[r++] = v[j];
        }
      } else if (!o[j]) {
        y = u[j] == q[l] ? v[j] : u[j];
        if (!k[y]) o[j] = (u[j] == q[l]) + 1;
      }
    }
  printf("%d\n", r);
  for (i = 0; i < m; i++)
    if (t[i] == 2) printf("%c", o[i] == 2 ? '-' : '+');
  printf("\n");
  return;
}
int main() {
  int n, m, s;
  int i;
  scanf("%d %d %d", &n, &m, &s);
  for (i = 0; i < m; i++) {
    scanf("%d %d %d", &t[i], &u[i], &v[i]);
    v[i]--;
    e[--u[i]].push_back(i);
    if (t[i] == 2) e[v[i]].push_back(i);
  }
  Maximize(m, --s);
  Minimize(m, s);
  return 0;
}
