#include <bits/stdc++.h>
const int N = 100;
const int B = 7;
int n;
std::pair<int, int> edge[N + 5];
std::vector<int> g[B + 5];
int d[B + 5];
bool exist[B + 5];
bool loop;
bool input() {
  scanf("%d", &n);
  for (int i = 0, i_END_ = B; i < i_END_; ++i) {
    g[i].clear();
    d[i] = 0;
    exist[i] = false;
  }
  for (int i = 0, i_END_ = n; i < i_END_; ++i) {
    int u, v;
    scanf("%d %d", &u, &v);
    edge[i] = std::pair<int, int>(u, v);
    d[u]++;
    d[v]++;
    exist[u] = exist[v] = true;
    g[u].push_back(i);
    g[v].push_back(i);
  }
  int cnt = 0;
  for (int i = 0, i_END_ = B; i < i_END_; ++i) cnt += d[i] & 1;
  loop = cnt == 0;
  if (cnt == 2 || cnt == 0) return true;
  return false;
}
int stk[N + 5], top;
bool flag[N + 5];
bool vis[N + 5];
void dfs(int u) {
  for (int i = 0, i_END_ = (int)g[u].size(); i < i_END_; ++i) {
    int e = g[u][i];
    if (vis[e]) continue;
    int v = edge[e].first ^ edge[e].second ^ u;
    vis[e] = true;
    dfs(v);
    stk[++top] = e;
    if (u == edge[e].first)
      flag[top] = true;
    else
      flag[top] = false;
  }
}
void output() {
  if (top != n) {
    puts("No solution");
    return;
  }
  while (top) {
    printf("%d %c\n", stk[top] + 1, flag[top] ? '+' : '-');
    top--;
  }
}
void solve() {
  top = 0;
  for (int i = 0, i_END_ = n; i < i_END_; ++i) vis[i] = false;
  if (loop)
    for (int i = 0, i_END_ = B; i < i_END_; ++i) {
      if (exist[i]) {
        dfs(i);
        break;
      }
    }
  else
    for (int i = 0, i_END_ = B; i < i_END_; ++i)
      if (d[i] & 1) {
        dfs(i);
        break;
      }
  output();
}
int main() {
  if (!input())
    puts("No solution");
  else
    solve();
  return 0;
}
