#include <bits/stdc++.h>

using namespace std;

//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//
//using namespace __gnu_pbds;
//template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

//class Timer {
//    clock_t start;
//    string name;
//public:
//    Timer() {name = "";start = clock();}
//    Timer(string s){name = s;start = clock();}
//    ~Timer() {fprintf(stderr, "%s: %.3gs\n", name.c_str(), 1.0*(clock() - start) / CLOCKS_PER_SEC);}
//};

//#define isValid(a, b) ((a) >= 0 && (a) < (b))
//int dr[]  =  {0, -1, -1, -1,  0,  1, 1, 1};
//int dc[]  =  {1,  1,  0, -1, -1, -1, 0, 1};

#define all(x) (x).begin(), (x).end()
#define pb push_back
#define eb emplace_back
#define um unordered_map
#define us unordered_set
#define endl '\n'
#define what_is(x) cerr << fixed << setprecision(2) << boolalpha << #x << " = " << x << endl

const double EPS = 1e-9;
const double PI = acos(-1.0);

template<typename T> inline T sq(T a){return a*a;}
template<typename T1, typename T2> inline pair<T1, T2> mp(T1 a, T2 b){return make_pair(a, b);}
template<typename T1, typename T2> inline T1 safeMod(T1 a, T2 m){return (a%m + m)%m;}/*handling negative sign of remainder*/
template<typename T1, typename T2> inline bool isEq(T1 a, T2 b){return abs(a - b) < EPS;}
template<typename T1, typename T2, typename T3> inline bool isEq(T1 a, T2 b, T3 eps){return abs(a - b) < eps;}
template<typename T> inline bool isKthBitOn(T n, int k){assert(n <= numeric_limits<T>::max());assert(k<=numeric_limits<T>::digits);T ONE = 1;return bool((n & (ONE<<k)));}
template<typename T> inline void setKthBit(T& n, int k){assert(n <= numeric_limits<T>::max());assert(k<=numeric_limits<T>::digits);T ONE = 1;n = (n|(ONE<<k));}
//mt19937 rng((int)chrono::steady_clock::now().time_since_epoch().count());
//template<typename T> inline T nextRand(T lo, T hi){return uniform_int_distribution<T>(lo, hi)(rng);}

#define toRad(deg) ((deg)*PI/180.0)
#define toDeg(rad) ((rad)*180.0/PI)

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int, int> pii;
typedef vector<int> vi;

const int oo = 0x3f3f3f3f;
const int MAX = 200010;
const int MOD = 998244353;
const int precision = 10;

ll preCalc[10][MAX];
ll preCalcP10[MAX];
ll tree[MAX<<2];
ll lazy[MAX<<2];
ll combine(ll lv, int rc, ll rv)
{
    return ((ll)lv*preCalcP10[rc]%MOD + rv)%MOD;
}

void build(int n, int l, int r)
{
    if(l == r){
        tree[n] = 1;
        return;
    }
    int md = (l+r)/2;
    int lf = 2*n;
    int rg = lf+1;
    build(lf, l, md);
    build(rg, md+1, r);
    tree[n] = combine(tree[lf], r-md, tree[rg]);
}

void propagate(int n, int l, int r)
{
    if(lazy[n]){
        tree[n] = preCalc[lazy[n]][r-l+1];
        if(l != r){
            lazy[2*n] = lazy[n];
            lazy[2*n+1] = lazy[n];
        }
    }
    lazy[n] = 0;
}

void update(int n, int l, int r, int ul, int ur, int v)
{
    propagate(n, l, r);
    if(r < ul || ur < l)return;
    if(ul <= l && r <= ur){
        lazy[n] = v;
        propagate(n, l, r);
        return;
    }
    int md = (l+r)/2;
    int lf = 2*n;
    int rg = lf+1;
    update(lf, l, md, ul, ur, v);
    update(rg, md+1, r, ul, ur, v);
    tree[n] = combine(tree[lf], r-md, tree[rg]);
}

void solve(int kas){
    int n, q;
    cin >> n >> q;
    build(1, 1, n);
    for(int i = 1; i <= q; i++){
        int l, r, d;
        cin >> l >> r >> d;
        update(1, 1, n, l, r, d);
        cout << tree[1] << endl;
//        cout << query(1, 1, n, l, r) << endl;
    }
}

int main()
{
    for(int i = 1; i < 10; i++){
        for(int j = 1; j < MAX; j++){
            preCalc[i][j] = (preCalc[i][j-1]*10%MOD + i)%MOD;
        }
    }
    preCalcP10[0] = 1;
    for(int i = 1; i < MAX; i++)preCalcP10[i] = preCalcP10[i-1]*10%MOD;
    //assert(freopen("in.txt", "r", stdin));
    //assert(freopen("out.txt", "w", stdout));
#ifdef ONLINE_JUDGE
    ios_base::sync_with_stdio(false); cin.tie(NULL);
#endif
    //cout << fixed << setprecision(precision);
    int tc = 1;
    //cin >> tc;
    for(int _ = 1; _ <= tc; _++){
        solve(_);
    }
    return 0;
}


Measured memory_bytes: 27492