#include <bits/stdc++.h>
using namespace std;
long long int mod = 1000000007;
vector<pair<long long int, long long int> > G[300007];
vector<pair<long long int, long long int> > E;
char ans1[300007];
char ans2[300007];
bool vis[300007];
void dfs1(long long int src) {
  if (vis[src]) return;
  long long int x, y, z;
  vis[src] = true;
  for (long long int i = 0; i < (int)G[src].size(); i++) {
    if (G[src][i].second >= 0) {
      x = src;
      y = G[src][i].first;
      z = G[src][i].second;
      if (!ans1[z]) {
        if (E[z].first == x && E[z].second == y)
          ans1[z] = '+';
        else
          ans1[z] = '-';
      }
    }
    dfs1(G[src][i].first);
  }
}
void dfs2(long long int src) {
  if (vis[src]) return;
  vis[src] = true;
  for (long long int i = 0; i < (int)G[src].size(); i++) {
    if (G[src][i].second == -1) {
      dfs2(G[src][i].first);
    }
  }
}
int main() {
  long long int i, j, k, l, m, n, p, q, x, y, z, a, b, r, s, t, n1, n2;
  scanf("%lld", &n);
  scanf("%lld", &m);
  scanf("%lld", &s);
  for (i = 0; i < m; i++) {
    scanf("%lld", &t);
    scanf("%lld", &x);
    scanf("%lld", &y);
    if (t == 1) {
      G[x].push_back(make_pair(y, -1));
    } else {
      G[x].push_back(make_pair(y, (int)E.size()));
      G[y].push_back(make_pair(x, (int)E.size()));
      E.push_back(make_pair(x, y));
    }
  }
  dfs2(s);
  n2 = 0;
  for (i = 1; i <= n; i++)
    if (vis[i]) n2++;
  for (i = 0; i < (int)E.size(); i++) {
    x = E[i].first;
    y = E[i].second;
    if (vis[x])
      ans2[i] = '-';
    else
      ans2[i] = '+';
  }
  ans2[(int)E.size()] = '\0';
  for (i = 1; i <= n; i++) vis[i] = false;
  dfs1(s);
  n1 = 0;
  for (i = 1; i <= n; i++)
    if (vis[i]) n1++;
  for (i = 0; i < (int)E.size(); i++) {
    if (!ans1[i]) ans1[i] = '+';
  }
  ans1[(int)E.size()] = '\0';
  cout << n1 << endl;
  cout << ans1 << endl;
  cout << n2 << endl;
  cout << ans2 << endl;
  return 0;
}
