#include <bits/stdc++.h>
#pragma comment(linker, "/stack:640000000")
using namespace std;
const double EPS = 1e-9;
const int INF = 0x7f7f7f7f;
const double PI = acos(-1.0);
template <class T>
inline T gcd(T a, T b) {
  return (b) == 0 ? (a) : gcd((b), ((a) % (b)));
}
template <class T>
inline T lcm(T a, T b) {
  return ((a) / gcd((a), (b)) * (b));
}
template <typename T>
string NumberToString(T Number) {
  ostringstream second;
  second << Number;
  return second.str();
}
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int t, n, m;
vector<pair<int, pair<int, int> > > adj[300005];
int ans[300005];
int type[300005];
int mark[300005];
int src;
int tot;
void dfsmx(int src) {
  mark[src] = 1;
  for (auto x : adj[src]) {
    int v = x.first;
    int dir = x.second.first;
    int ed = x.second.second;
    if (mark[v] == 0) {
      ans[ed] = dir;
      dfsmx(v);
    }
  }
}
void dfsmn(int src) {
  mark[src] = 1;
  for (auto x : adj[src]) {
    int v = x.first;
    int dir = x.second.first;
    int ed = x.second.second;
    if (mark[v] == 0) {
      if (!type[ed])
        dfsmn(v);
      else
        ans[ed] = !dir;
    }
  }
}
int main() {
  while (~scanf("%d%d", &n, &m)) {
    memset(mark, 0, sizeof(mark));
    tot = 0;
    for (int i = 1; i <= (n); i++) adj[i].clear();
    memset(ans, 0, sizeof(ans));
    scanf("%d", &src);
    for (int i = 1; i <= (m); i++) {
      int a, b, c;
      scanf("%d%d%d", &a, &b, &c);
      type[i] = a - 1;
      if (a == 1)
        adj[b].push_back({c, {0, i}});
      else {
        tot++;
        adj[b].push_back({c, {0, i}});
        adj[c].push_back({b, {1, i}});
      }
    }
    memset(mark, 0, sizeof(mark));
    dfsmx(src);
    int res = 0;
    for (int i = 1; i <= (n); i++)
      if (mark[i]) res++;
    printf("%d\n", res);
    for (int i = 1; i <= (m); i++)
      if (type[i]) printf("%c", ans[i] ? '-' : '+');
    puts("");
    memset(mark, 0, sizeof(mark));
    memset(ans, 0, sizeof(ans));
    dfsmn(src);
    res = 0;
    for (int i = 1; i <= (n); i++)
      if (mark[i]) res++;
    printf("%d\n", res);
    for (int i = 1; i <= (m); i++)
      if (type[i]) printf("%c", ans[i] ? '-' : '+');
    puts("");
  }
  return 0;
}
