#include <bits/stdc++.h>
using namespace std;
const int maxN = 3e5 + 100;
int t[maxN], k1[maxN], k2[maxN];
char ans[maxN];
int cnt, n, m, s;
bool mark[maxN];
vector<pair<int, int> > g[maxN];
void input() {
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    cin >> t[i] >> k1[i] >> k2[i];
    g[k1[i]].push_back({k2[i], i});
    if (t[i] == 2) g[k2[i]].push_back({k1[i], i});
  }
}
void BFS(int v, bool kill = false) {
  mark[v] = true;
  queue<int> q;
  q.push(v);
  cnt = 0;
  while (q.size() > 0) {
    v = q.front();
    q.pop();
    cnt++;
    for (int i = 0; i < g[v].size(); i++)
      if (!mark[g[v][i].first]) {
        if (t[g[v][i].second] == 1) {
          mark[g[v][i].first] = true;
          q.push(g[v][i].first);
        } else {
          if (kill == false) {
            if (k1[g[v][i].second] == g[v][i].first)
              ans[g[v][i].second] = '+';
            else
              ans[g[v][i].second] = '-';
          } else if (kill == true) {
            mark[g[v][i].first] = true;
            q.push(g[v][i].first);
            if (k1[g[v][i].second] == g[v][i].first)
              ans[g[v][i].second] = '-';
            else
              ans[g[v][i].second] = '+';
          }
        }
      }
  }
}
void show() {
  cout << cnt << endl;
  for (int i = 1; i <= m; i++)
    if (t[i] == 2) cout << ans[i];
  cout << endl;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0), cout.tie(0);
  input();
  fill(ans, ans + m + 10, '-');
  BFS(s, true);
  show();
  memset(mark, 0, sizeof(mark));
  BFS(s);
  show();
  return 0;
}
