#include using namespace std; //#pragma GCC optimize("Ofast") #define rep(i,n) for(ll i=0;i=0;i--) #define perl(i,r,l) for(ll i=r-1;i>=l;i--) #define fi first #define se second #define pb push_back #define ins insert #define pqueue(x) priority_queue,greater> #define all(x) (x).begin(),(x).end() #define CST(x) cout<; using vvl=vector>; using pl=pair; using vpl=vector; using vvpl=vector; const ll MOD=1000000007; const ll MOD9=998244353; const int inf=1e9+10; const ll INF=4e18; const ll dy[8]={1,0,-1,0,1,1,-1,-1}; const ll dx[8]={0,1,0,-1,1,-1,1,-1}; template inline bool chmax(T &a, T b) { return ((a < b) ? (a = b, true) : (false)); } template inline bool chmin(T &a, T b) { return ((a > b) ? (a = b, true) : (false)); } int main(){ ll n;cin >> n; vector> g(n); map mp; rep(i,n){ ll a,b;cin >> a >> b;a--;b--; g[a].insert(b); g[b].insert(a); mp[{a,b}]=i; } queue que; vl ans(n); set unuse;rep(i,n)unuse.insert(i); rep(i,n)if(g[i].size()==1)que.push(i); while(que.size()){ ll v=que.front();que.pop();unuse.erase(v); ll f=*g[v].begin(); if(mp.count({v,f})){ ans[mp[{v,f}]]=1; } g[f].erase(v);if(g[f].size()==1)que.push(f); } ll p=*unuse.begin(); //cout << p << endl; //cout << unuse.size() << endl; while(unuse.size()){ // cout << unuse.size() << endl; unuse.erase(p); ll np=*g[p].begin(); if(mp.count({p,np})){ ans[mp[{p,np}]]=1; } g[p].erase(np);g[np].erase(p); p=np; } rep(i,n)cout << (ans[i]? "->":"<-") << endl; }