/*
Writer: SPD_9X2
https://atcoder.jp/contests/agc041/tasks/agc041_e

T = 1
均一的な状態を求める問題

wを決めちゃったとしよう
最後にすべてのコインがwにたどり着く
→後ろから見ていくのが良さそう

wに集めるのが目的なので、
当然wに繋がってるケーブルはwに向けるべき
wに繋いだケーブルは、以後出て来たケーブルはそこに向けるべき

→後ろから見ていって、wと繋がってるフラグを伝播させていく
　すべての辺が繋がったらおk

あとはこれを上手く一般化してwを考えなくてよくする
後ろから見ていくので、一度つながった2ケーブルは以後同一視できる
→ufなどができる
→ほんとうか？？
→うーん

むしろ左から見ていってみる
全てのコインが行けるケーブルがあればいい

bitsetで最初の方針を平行で全部やる
計算量はO(NM)//64 = 10**8ぐらい
いけなくはないな
→とけた！！


T = 2

まず、お互いに繋がってない2ケーブルがあったら、その2本に
矢印を向けることで構成完了。
よって、最低でもすべての2辺のペアが接続されていないと存在する。
よって、制約的に存在する場合は N < 500 程度になる

3本以上ある場合-1ではありえなさそう
3本で解ければ勝ったも同然


*/

#include <bits/stdc++.h>
#include <iostream>
#include <limits>
#include <numeric>
#include <type_traits>
#include <bitset>

using namespace std;

#define rep(i,n,m) for(ll (i)=(n);(i)<(m);(i)++)
#define rrep(i,n,m) for(ll (i)=(n);(i)>(m);(i)--)
using ll = long long;
const ll mod = 998244353;

int want(vector<vector<int>>& ott , int ind , vector<int> now , vector<char>& ans){
    
    if (ind == ott.size()){
        return 1; //ok
    }

    int x,y,ci;
    x = ott[ind][0];
    y = ott[ind][1];
    ci = ott[ind][2];
    int cat;
    vector<int> nnow;
    
    //だめな場合
    if (now[3-x-y] == 0) return 0; //dame

    //xによせる場合

    nnow = {now[0],now[1],now[2]};
    nnow[x] += nnow[y];
    nnow[y] = 0;
    cat = want(ott,ind+1,nnow,ans);
    if (cat){
        ans[ci] = '^';
        return 1;
    }

    nnow = {now[0],now[1],now[2]};
    nnow[y] += nnow[x];
    nnow[x] = 0;
    cat = want(ott,ind+1,nnow,ans);
    if (cat){
        ans[ci] = 'v';
        return 1;
    }

    return 0;
}


int main(){

    int N,M,T;
    cin >> N >> M >> T;

    vector<vector<int>> xy(M, vector<int> (2));
    rep(i,0,M){
        cin >> xy[i][0] >> xy[i][1];
        xy[i][0]--;
        xy[i][1]--;
    }

    if (T == 1){
        vector<bitset<50000>> bslis(50000);
        rep(i,0,N){
            bslis[i].set(i);
        }
        
        rrep(i,M-1,-1){
            bslis[xy[i][0]] |= bslis[xy[i][1]];
            bslis[xy[i][1]] |= bslis[xy[i][0]];
        }

        bitset<50000> las;
        las.set();
        rep(i,0,N){
            las &= bslis[i];
        }
            
            int ind = -1;
            rep(i,0,N){
                if (las.test(i)){
                    ind = i;
                    break;
                }
            }

            if (ind == -1){
                cout << -1 << endl;
                return 0;
            }

            vector<char> ans(M);
            vector<int> hi(N);
            hi[ind] = 1;
            rrep(i,M-1,-1){

                if (hi[xy[i][0]] == 1){
                    hi[xy[i][1]] = 1;
                    ans[i] = '^';
                }else if (hi[xy[i][1]] == 1){
                    hi[xy[i][0]] = 1;
                    ans[i] = 'v';
                }else{
                    ans[i] = '^';
                }
            }

            rep(i,0,M){
                cout << ans[i];
            }
            cout << endl;

        return 0;
    }else{ //T==2

        if (N == 2){
            cout << -1 << endl;
            return 0;
        }

        vector<char> ans(M);
        vector<vector<int>> ott(0,vector<int> (3));
        rep(i,0,M){
            if ((xy[i][0] < 3) && (xy[i][1] < 3)){
                ott.push_back({xy[i][0] , xy[i][1] , i});
            }else if (xy[i][0] < 3){
                ans[i] = '^';
            }else{
                ans[i] = 'v';
            }
        }

        want(ott ,0, {1,1,1} , ans);
        rep(i,0,M){
            cout << ans[i];
        }
        cout << endl;

        return 0;
    }
}

Measured memory_bytes: 314524