/*
* Problem :: 2840 / 행운의 바퀴
*
* Kind :: Simulation
*
* Insight
* - 처음에 어떤 칸부터 시작하는 건지 알 수가 없다
* 맨 마지막에 도착한 칸부터 거꾸로 생각해야겠다
* (그러고보니 문제도 도착한 칸부터 시계방향으로 출력해야 된다)
* + 예제 입력 3
* 8 8
* 4 V / HONITAVR / idx = (3+3) % 8 = 6
* 3 I / HONITA?R / idx = (4+7) % 8 = 3
* 7 T / HON?TA?R / idx = (5+7) % 8 = 4
* 7 A / HON??A?R / idx = (7+6) % 8 = 5
* 6 R / HON????R / idx = (2+5) % 8 = 7
* 5 N / HON????? / idx = (1+1) % 8 = 2
* 1 O / HO?????? / idx = (0+9) % 8 = 1
* 9 H / H??????? / idx = 0
* # 마지막 회전에서 가리키는 글자(H)를 idx=0 으로 잡고
* 다시 반시계방향으로 회전(idx 증가)시켜서 도착한 칸에 그 이전 회전의 문자를 기록해준다
* 이를 반복해주면서 바퀴의 글자들을 최대한 찾아주자
*
* Point
* - 바퀴에 같은 글자는 두 번 이상 등장하지 않는다
* + 이미 바퀴에 기록된 글자는 사용할 수 없다
* # https://www.acmicpc.net/board/view/26362
* 4 4
* 1 A / AAAA
* 1 A / AAA?
* 1 A / AA??
* 1 A / A???
* -> 그러나 같은 글자가 2번 이상 쓰였기에
* 위에 해당하는 바퀴는 없다!
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <cstring>
#include <map>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, K;
cin >> N >> K;
int S[K]; char C[K];
for (int i=0; i<K; i++)
cin >> S[i] >> C[i];
// Process
char A[N]; memset(A, '?', sizeof(A)); /* 초기 바퀴 */
map<char,bool> isUsed;
int idx = 0; /* 인덱스 초기화 */
A[idx] = C[K-1]; /* 바퀴 초기화 */
bool isValid = true;
for (int i=K-1; i>=1; i--) {
/* 마지막 회전부터 반시계 방향 회전 */
idx += S[i];
idx %= N;
/* 아직 글자가 안써진 칸에 이미 바퀴에 사용된 글자를 적어야 한다면 */
if (A[idx] == '?' && isUsed[C[i-1]]) {
isValid = false; /* 그러한 바퀴는 없음 */
break;
}
/* 글자가 써진 칸에 다른 글자를 적어야 한다면 */
if (A[idx] != '?' && A[idx] != C[i-1]) {
isValid = false; /* 그러한 바퀴는 없음 */
break;
}
A[idx] = C[i-1]; /* 해당 칸에 글자 기록 */
isUsed[C[i-1]] = true; /* 글자 사용 처리 */
}
// Control : Output
cout << ((isValid) ? string(A, A+N) : "!") << endl;
}
// Helper Functions
/* None */