#include <bits/stdc++.h>
using namespace std;

// N*M = 5,000,000,000 -> 5/8 GB
// N*N = 2,500,000,000 -> 2.5/8 GB

const int MAX_N = 50123;

int n, m, T;
vector<pair<int,int>> balancers;

void one() {
	vector<bitset<MAX_N>> mask(n);
	for(int i = 0; i < n; ++i) {
		mask[i][i] = 1;
	}
	for(pair<int,int> p : balancers) {
		mask[p.first] |= mask[p.second];
		mask[p.second] = mask[p.first];
	}
	int last = -1;
	for(int i = 0; i < n; ++i) {
		if((int) mask[i].count() == n) {
			last = i;
			break;
		}
	}
	if(last == -1) {
		puts("-1");
		exit(0);
	}
	vector<bool> good(n);
	good[last] = true;
	string s(m, '?');
	for(int i = m - 1; i >= 0; --i) {
		int x = balancers[i].first;
		int y = balancers[i].second;
		if(good[x]) {
			s[i] = '^';
			good[y] = true;
		}
		else if(good[y]) {
			s[i] = 'v';
			good[x] = true;
		}
		else {
			s[i] = 'v';
		}
	}
	printf("%s\n", s.c_str());
}

vector<pair<int, pair<int,int>>> parent[1000][1000];
vector<vector<bool>> good;
void can_go(int a, int b, int c, int d, int tim) {
	if(good[a][b] && !good[c][d]) {
		good[c][d] = true;
		parent[c][d].push_back({tim, {a, b}});
	}
}

void two() {
	assert(T == 2);
	set<pair<int,int>> set;
	for(pair<int,int> p : balancers) {
		set.insert(p);
	}
	for(int i = 0; i < n; ++i) {
		for(int j = i + 1; j < n; ++j) {
			if(!set.count({i, j})) {
				string s;
				for(pair<int,int> p : balancers) {
					assert(p != make_pair(i, j));
					if(p.first == i || p.first == j) {
						s += '^';
					}
					else if(p.second == i || p.second == j) {
						s += 'v';
					}
					else {
						s += 'v';
					}
				}
				printf("%s\n", s.c_str());
				cerr << "pair is " << i << " " << j << endl;
				exit(0);
			}
		}
	}
	cerr << "N is for sure small!" << endl;
	assert(n < 1000);
	good.resize(n, vector<bool>(n));
	// vector<vector<bool>> good(n, vector<bool>(n));
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < n; ++j) {
			if(i != j) {
				good[i][j] = true;
			}
		}
	}
	
	for(int tim = 0; tim < m; ++tim) {
		pair<int,int> p = balancers[tim];
		int x = p.first;
		int y = p.second;
		good[x][y] = good[y][x] = false;
		for(int i = 0; i < n; ++i) {
			if(i != x && i != y) {
				// can_go(i, x, i, x, tim);
				can_go(i, x, i, y, tim);
				can_go(i, y, i, x, tim);
				can_go(x, i, y, i, tim);
				can_go(y, i, x, i, tim);
			}
		}
	}
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < n; ++j) {
			assert(good[i][j] == good[j][i]);
			if(i < j && good[i][j]) {
				string s(m, '?');
				// printf("%d %d\n", i, j);
				// printf("YES %d %d\n", i, j);
				int tim = m;
				auto move_down_to = [&](int new_time) { // tim-1 ... new_time
					for(int b = tim - 1; b >= new_time; --b) {
						int x = balancers[b].first;
						int y = balancers[b].second;
						assert(make_pair(min(i, j), max(i, j)) != make_pair(x, y));
						assert(s[b] == '?');
						if(x == i || x == j) {
							s[b] = '^';
						}
						else if(y == i || y == j) {
							s[b] = 'v';
						}
						else {
							s[b] = 'v';
						}
					}
				};
				while(!parent[i][j].empty()) {
					pair<int, pair<int,int>> pp = parent[i][j].back();
					if(pp.first > tim) {
						parent[i][j].pop_back();
					}
					else {
						assert(pp.first < tim);
						move_down_to(pp.first + 1);
						tim = pp.first;
						assert(0 <= tim && tim < m);
						assert(s[tim] == '?');
						assert((i == pp.second.first) != (j == pp.second.second));
						if(make_pair(i, j) < pp.second) {
							s[tim] = '^';
						}
						else {
							s[tim] = 'v';
						}
						tie(i, j) = pp.second;
						// printf("%d %d time=%d\n", i, j, tim);
					}
				}
				move_down_to(0);
				for(char ch : s) {
					assert(ch != '?');
				}
				// assert(false);
				printf("%s\n", s.c_str());
				exit(0);
			}
		}
	}
	puts("-1");
}

int main() {
	scanf("%d%d%d", &n, &m, &T);
	balancers.resize(m);
	for(pair<int,int>& p : balancers) {
		scanf("%d%d", &p.first, &p.second);
		--p.first;
		--p.second;
	}
	if(T == 1) {
		one();
	}
	else {
		two();
	}
}


Measured memory_bytes: 330880