#include using namespace std; #define SZ(x) ((int)(x).size()) int main() { ios_base::sync_with_stdio(0), cin.tie(0); int N, M; cin >> N >> M; vector> adj(N+1); for (int i = 0; i < M; ++i) { int u, v; cin >> u >> v; adj[u].emplace(v), adj[v].emplace(u); } vector ops; deque deq; for (int i = 2; i <= N; ++i) { if (SZ(adj[i]) <= 2) deq.emplace_back(i); } while (SZ(deq)) { int now = deq[0]; deq.pop_front(); if (now == 1 or SZ(adj[now]) == 0) continue; if (SZ(adj[now]) == 1) { int v = now, u = *begin(adj[now]); ops.emplace_back("L"s + " "s + to_string(u) + " "s + to_string(v)); adj[u].erase(v), adj[v].erase(u); if (SZ(adj[u]) == 2) deq.emplace_back(u); } else { int w = now, u = *begin(adj[now]), v = *next(begin(adj[now])); ops.emplace_back("I"s + " "s + to_string(u) + " "s + to_string(v) + " "s + to_string(w)); adj[w].erase(u), adj[u].erase(w); adj[w].erase(v), adj[v].erase(w); if (adj[u].count(v)) { ops.emplace_back("D"s + " "s + to_string(u) + " "s + to_string(v)); if (SZ(adj[u]) == 2) deq.emplace_back(u); if (SZ(adj[v]) == 2) deq.emplace_back(v); } else { adj[u].emplace(v), adj[v].emplace(u); } } } if (SZ(ops) == M) { cout << "Yes" << "\n"; reverse(begin(ops), end(ops)); for (const string &str : ops) cout << str << "\n"; } else { cout << "No" << "\n"; } return 0; }