#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int v, next;
} edge[100010];
int head[10];
int pos;
void insert(int x, int y) {
  edge[pos].v = y;
  edge[pos].next = head[x];
  head[x] = pos++;
}
int du[10];
int pp[100010];
int qq;
int fa[10];
int find(int x) {
  if (fa[x] != x) fa[x] = find(fa[x]);
  return fa[x];
}
void uunion(int x, int y) {
  int fx = find(x);
  int fy = find(y);
  fa[fx] = fy;
}
bool vis[100010];
void dfs(int now) {
  for (int i = head[now]; i != -1; i = edge[i].next) {
    if (vis[i / 2]) continue;
    vis[i / 2] = true;
    dfs(edge[i].v);
    pp[qq++] = i ^ 1;
  }
}
int main() {
  int n;
  scanf("%d", &n);
  memset(head, -1, sizeof(head));
  pos = 0;
  for (int i = 0; i <= 6; i++) fa[i] = i;
  for (int i = 0; i < n; i++) {
    int x, y;
    scanf("%d %d", &x, &y);
    insert(x, y);
    insert(y, x);
    du[x]++;
    du[y]++;
    uunion(x, y);
  }
  bool flag = true;
  for (int i = 0; i <= 6; i++)
    for (int j = 0; j <= 6; j++)
      if (du[i] > 0 && du[j] > 0 && find(i) != find(j)) flag = false;
  if (!flag) {
    printf("No solution\n");
    return 0;
  }
  qq = 0;
  for (int i = 0; i <= 6; i++)
    if (du[i] & 1) pp[qq++] = i;
  if (qq > 2) {
    printf("No solution\n");
    return 0;
  }
  for (int i = 0; i <= 6; i++)
    if (du[i] != 0) pp[qq++] = i;
  int begin = pp[0];
  qq = 0;
  memset(vis, false, sizeof(vis));
  dfs(begin);
  for (int i = 0; i < qq; i++) {
    printf("%d ", pp[i] / 2 + 1);
    if (pp[i] & 1)
      printf("-");
    else
      printf("+");
    printf("\n");
  }
  return 0;
}
