#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;
template<class T>
inline bool chmax(T &a, T b) {
    if(a < b) {
        a = b;
        return true;
    }
    return false;
}

template<class T>
inline bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
//const ll mod = 1000000007;
int N, M, T;
int x[100000], y[100000];
string ans;
bool Reach[100000];

void solve1() {
    vector<bitset<50000>> bits;
    bits.resize(N);
    for(int i = 0; i < N; i++) {
        bits[i][i] = true;
    }
    for(int i = 0; i < M; i++) {
        bits[x[i]] |= bits[y[i]];
        bits[y[i]] |= bits[x[i]];
    }
    int ansidx = -1;
    for(int i = 0; i < N; i++) {
        if(bits[i].count() == N) ansidx = i;
    }
    if(ansidx == -1) {
        cout << -1 << endl;
        return;
    }
    Reach[ansidx] = true;
    for(int e = M - 1; e >= 0; e--) {
        if(Reach[x[e]]) ans[e] = '^';
        else ans[e] = 'v';
        Reach[x[e]] |= Reach[y[e]];
        Reach[y[e]] |= Reach[x[e]];
    }
    cout << ans << endl;
}

vector<int> Connect[50000];
int Index[50000];

void solve2() {
    if(N == 2) {
        cout << -1 << endl;
        return;
    }
    for(int i = 0; i < M; i++) {
        Connect[x[i]].push_back(y[i]);
        Connect[y[i]].push_back(x[i]);
    }
    for(int i = 0; i < N; i++) {
        Reach[i] = true;
    }
    int num = N;
    for(int e = 0; e < M; e++) {
        assert(Connect[x[e]][Index[x[e]]] == y[e]);
        assert(Connect[y[e]][Index[y[e]]] == x[e]);
        if(num > 3) {
            ans[e] = '^';
            num -= Reach[x[e]];
            num -= Reach[y[e]];
            Reach[x[e]] |= Reach[y[e]];
            Reach[y[e]] = false;
            num += Reach[x[e]];
            num += Reach[y[e]];
        } else {
            num -= Reach[x[e]];
            num -= Reach[y[e]];
            if(Index[x[e]] + 1 < Connect[x[e]].size() and Reach[Connect[x[e]][Index[x[e]] + 1]]) {
                int to = Connect[x[e]][Index[x[e]]+1];
                //cerr << x[e] << " " << y[e] << " " << to << endl;
                /*
                if(Connect[to].size() <= Index[to]) {
                    for(int i = 0; i <= 1e9; i++) cout << "A" << endl;
                }
                */
                int newidx = Index[to];
                if(to == y[e]) newidx++;
                if(Connect[to][newidx] == x[e]) {
                    ans[e] = 'v';
                    Reach[y[e]] |= Reach[x[e]];
                    Reach[x[e]] = false;
                } else {
                    ans[e] = '^';
                    Reach[x[e]] |= Reach[y[e]];
                    Reach[y[e]] = false;
                }
            } else {
                ans[e] = '^';
                Reach[x[e]] |= Reach[y[e]];
                Reach[y[e]] = false;
            }
            num += Reach[x[e]];
            num += Reach[y[e]];
        }
        Index[x[e]]++;
        Index[y[e]]++;
        /*
        for(int i = 0; i < N; i++) cerr << Index[i] << " ";
        cerr << endl;
        */
    }
    cout << ans << endl;
}


int main() {
    //cout.precision(10);
    cin.tie(0);
    ios::sync_with_stdio(false);
    cin >> N >> M >> T;
    for(int i = 0; i < M; i++) {
        cin >> x[i] >> y[i];
        x[i]--;
        y[i]--;
    }
    ans = string(M, 'a');
    if(T == 1) solve1();
    else solve2();
    return 0;
}


Measured memory_bytes: 307968