#include "bits/stdc++.h" using namespace std; #define all(x) begin(x),end(x) template ostream& operator<<(ostream &os, const pair &p) { return os << '(' << p.first << ", " << p.second << ')'; } template::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { string sep; for (const T &x : v) os << sep << x, sep = " "; return os; } #define debug(a) cerr << "(" << #a << ": " << a << ")\n"; typedef long long ll; typedef vector vi; typedef vector vvi; typedef pair pi; const int mxN = 1e5+1, oo = 1e9; int main() { int n; cin >> n; vector>> adj(n); for(int i=0;i> a >> b; --a,--b; adj[a].push_back({b,i}); adj[b].push_back({a,-i-1}); } // find cycle, then take it as root. vector ans(n),vis(n); int root=-1; auto dfs = [&](auto&& self, int at, int from) -> void { vis[at]=1; for(auto [to,id] : adj[at]) if(to!=from) { if(vis[to]) { root=to; } else { self(self,to,at); } } }; dfs(dfs,0,-1); fill(all(vis),0); auto dfs2 = [&](auto&& self, int at, int from) -> void { vis[at]=1; for(auto [to,id] : adj[at]) if(to!=from) { if(vis[to]) { if(to==root)if(id>=0) ans[id]=1; } else { self(self,to,at); if(id>=0) ans[id]=1; } } }; dfs2(dfs2,root,-1); for(auto b : ans) { if(b) cout << "<-\n"; else cout << "->\n"; } }