#include <bits/stdc++.h>
using namespace std;
int n, m, s, to1, to2, u[300005], v[300005], t[100005];
int out1[300005], out2[300005], q[600006];
bool vis[300005];
vector<int> edge[300005], num[300005];
void bfs1() {
  int h = 1, t = 1;
  q[1] = s;
  vis[s] = to1 = 1;
  while (h <= t) {
    int x = q[h];
    for (int i = 0; i < edge[x].size(); i++) {
      int y = edge[x][i], z = num[x][i];
      if (vis[y]) continue;
      q[++t] = y;
      vis[y] = 1;
      to1++;
      if (z)
        if (x == u[z])
          out1[z] = 1;
        else
          out1[z] = -1;
    }
    h++;
  }
}
void bfs2() {
  memset(vis, 0, sizeof(vis));
  int h = 1, t = 1;
  q[1] = s;
  vis[s] = to2 = 1;
  while (h <= t) {
    int x = q[h];
    for (int i = 0; i < edge[x].size(); i++) {
      int y = edge[x][i], z = num[x][i];
      if (vis[y]) continue;
      if (z) {
        if (x == u[z])
          out2[z] = -1;
        else
          out2[z] = 1;
      } else {
        vis[y] = 1;
        q[++t] = y;
        to2++;
      }
    }
    h++;
  }
}
int main() {
  cin >> n >> m >> s;
  for (int i = 1; i <= m; i++) {
    scanf("%d%d%d", &t[i], &u[i], &v[i]);
    if (t[i] == 2) {
      edge[u[i]].push_back(v[i]);
      edge[v[i]].push_back(u[i]);
      num[u[i]].push_back(i);
      num[v[i]].push_back(i);
    } else {
      edge[u[i]].push_back(v[i]);
      num[u[i]].push_back(0);
    }
  }
  bfs1();
  bfs2();
  cout << to1 << endl;
  for (int i = 1; i <= m; i++)
    if (out1[i] == 1)
      printf("+");
    else if (out1[i] == -1)
      printf("-");
    else if (t[i] == 2)
      printf("+");
  cout << endl << to2 << endl;
  for (int i = 1; i <= m; i++)
    if (out2[i] == 1)
      printf("+");
    else if (out2[i] == -1)
      printf("-");
    else if (t[i] == 2)
      printf("+");
  return 0;
}
