#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 5;
int n, m, idx;
struct Node { int fa, ans, first; vector <int> son; } a[N];
struct Edge { int frm, to; bool avl; } e[N];
struct Query { char op; int x, y; } q[N];
int getfa(int x) { return x == a[x].fa ? x : a[x].fa = getfa(a[x].fa); }
void merge(int x, int y, int z) {
x = getfa(x), y = getfa(y);
if (x == y) return;
if (a[x].ans == 0 && a[y].ans != 0) swap(x, y);
if (a[x].ans != 0 && a[y].ans == 0) for (int i : a[y].son) a[i].ans = z;
if (a[x].son.size() < a[y].son.size()) swap(x, y);
a[y].fa = x;
for (int i : a[y].son) a[x].son.push_back(i);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) a[i] = {i, m}, a[i].son.push_back(i);
for (int i = 1; i <= m; ++i) {
cin >> q[i].op >> q[i].x;
if (q[i].op == 'D') a[q[i].x].ans = 0, a[q[i].x].first = a[q[i].x].first == 0 ? i : a[q[i].x].first;
if (q[i].op == 'A') cin >> q[i].y, e[++idx] = {q[i].x, q[i].y, true};
if (q[i].op == 'R') e[q[i].x].avl = false;
}
for (int i = 1; i <= idx; ++i) if (e[i].avl) merge(e[i].frm, e[i].to, n);
for (int i = m; i >= 1; --i) {
if (q[i].op == 'D') if (!a[q[i].x].ans && a[q[i].x].first == i) for (int j : a[getfa(q[i].x)].son) a[j].ans = i - 1;
if (q[i].op == 'R') merge(e[q[i].x].frm, e[q[i].x].to, i - 1);
}
for (int i = 1; i <= n; ++i) cout << a[i].ans << '\n';
}