#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int a, b;
};
Edge edge[100];
int hMany[7][7];
vector<int> result;
void findPath(int v) {
  for (int i = 0; i <= 6; i++)
    if (hMany[v][i] != 0) {
      hMany[v][i]--;
      if (i != v) hMany[i][v]--;
      findPath(i);
    }
  result.push_back(v);
}
bool was[7];
void dfs(int v) {
  was[v] = true;
  for (int i = 0; i < 7; i++)
    if (!was[i] && hMany[v][i] != 0) dfs(i);
}
bool used[100];
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d%d", &edge[i].a, &edge[i].b);
    hMany[edge[i].a][edge[i].b]++;
    hMany[edge[i].b][edge[i].a]++;
  }
  int startFrom = -1;
  int odd = 0;
  for (int i = 0; i <= 6; i++) {
    int cnt = 0;
    for (int j = 0; j <= 6; j++) cnt += hMany[i][j];
    if (cnt % 2 == 1) {
      odd++;
      startFrom = i;
    }
    if (startFrom == -1 && cnt != 0) startFrom = i;
  }
  if (odd > 2) {
    cout << "No solution";
    return 0;
  }
  dfs(startFrom);
  for (int i = 0; i <= 6; i++) {
    int cnt = 0;
    for (int j = 0; j <= 6; j++) cnt += hMany[i][j];
    if (cnt != 0)
      if (!was[i]) {
        cout << "No solution";
        return 0;
      }
  }
  findPath(startFrom);
  for (int i = 0; i < result.size() - 1; i++) {
    int from = result[i];
    int to = result[i + 1];
    for (int j = 0; j < n; j++)
      if (!used[j])
        if ((from == edge[j].a && to == edge[j].b) ||
            (from == edge[j].b && to == edge[j].a)) {
          used[j] = true;
          if (from == edge[j].a)
            cout << j + 1 << " +" << endl;
          else
            cout << j + 1 << " -" << endl;
          break;
        }
  }
}
