#include <bits/stdc++.h>
using namespace std;
using namespace std;
vector<pair<pair<int, int>, pair<int, int> > > a[300005];
vector<int> g1[300005];
vector<int> g2[300005];
string Max = "", Min = "";
int ansMax = 0;
int ansMin = 0;
bool used[300005];
void getMax(int cur) {
  ansMax++;
  used[cur]++;
  for (auto it : g1[cur]) {
    if (!used[it]) {
      getMax(it);
    }
  }
}
void getMin(int cur) {
  ansMin++;
  used[cur]++;
  for (auto it : g2[cur]) {
    if (!used[it]) {
      getMin(it);
    }
  }
}
void updateMax(int s) {
  queue<int> q;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (used[u]) {
      continue;
    }
    used[u]++;
    for (auto it : a[u]) {
      if (it.first.first == 1) {
        if (!used[it.second.second]) {
          q.push(it.second.second);
          g1[u].push_back(it.second.second);
        }
      } else {
        if (u == it.second.first) {
          if (!used[it.second.second]) {
            q.push(it.second.second);
            g1[u].push_back(it.second.second);
          }
        } else {
          if (!used[it.second.first]) {
            q.push(it.second.first);
            g1[u].push_back(it.second.first);
            Max[it.first.second] = '-';
          }
        }
      }
    }
  }
}
void updateMin(int s) {
  queue<int> q;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    if (used[u]) {
      continue;
    }
    used[u]++;
    for (auto it : a[u]) {
      if (it.first.first == 2) {
        if (u == it.second.first) {
          if (!used[it.second.second]) {
            Min[it.first.second] = '-';
          }
        }
      }
    }
    for (auto it : a[u]) {
      if (it.first.first == 1 && !used[it.second.second]) {
        g2[u].push_back(it.second.second);
        q.push(it.second.second);
      }
    }
  }
}
int main() {
  int n, m, s;
  scanf("%d%d%d", &n, &m, &s);
  int i, t, u, v;
  int d = 0;
  for (i = 0; i < m; i++) {
    scanf("%d%d%d", &t, &u, &v);
    if (t == 1) {
      a[u].push_back({{t, i}, {u, v}});
    } else {
      a[u].push_back({{t, d}, {u, v}});
      a[v].push_back({{t, d}, {u, v}});
      d++;
      Max += '+';
      Min += '+';
    }
  }
  updateMax(s);
  memset(used, 0, sizeof used);
  getMax(s);
  printf("%d\n", ansMax);
  cout << Max << endl;
  memset(used, 0, sizeof used);
  updateMin(s);
  memset(used, 0, sizeof used);
  getMin(s);
  printf("%d\n", ansMin);
  cout << Min;
  return 0;
}
