/*
 Atcoder ACL
*/


#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:336777216")
#pragma GCC optimize("Ofast")

#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <functional>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
#define int long long int
typedef complex<long double> cd;
const long double pi=acos(-1);
typedef double db;
typedef long double ldb;
typedef pair <int,int> pii;
typedef pair <db,db> pdd;
typedef vector<int> vi;
typedef vector<vector<int> > matrix;

#define m1 make_pair
#define pb push_back
#define flush fflush(stdout)
#define IOS std::ios::sync_with_stdio(false); cin.tie(NULL);cout.tie(NULL);
#define reset(x,v) memset(x,v,sizeof(x))

#define fi first
#define se second
#define endl "\n"
#define debug(x) (cerr << #x << ": " << x << "\n")
#define setbits(x) __builtin_popcount(x)
#define setbitsll(x) __builtin_popcountll(x)
#define all(x) x.begin(),x.end()
#define pii pair<int,int>

inline int gcd(int a,int b){if(a==0) return b;return gcd(b%a,a);}
inline int power(ll a,ll n,ll m){if(n==0)return 1;ll p=power(a,n/2,m);p=(p%m*p%m)%m;if(n%2) return (p%m*a%m)%m;else return p;}
const double EPS = 1e-9;
const ll MOD =998244353;
const ll hell=MOD;
const int INF = 1e8;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
template<typename T>
using ordered_set=tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;

auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
std::mt19937 rng(seed);

double startTime;
double getCurrentTime() {
    return ((double)clock() - startTime) / CLOCKS_PER_SEC;
}
const int dx[] = { -1, 0, 1, 0 };

const int dy[] = { 0, 1, 0, -1 };

const int N=200005;
int pr[N+1];
int st[4*N];int lazy[4*N];int pre[N+1];

void update(int i,int l,int r,int qs,int qe,int v)
{
    if(lazy[i]!=0)
    {
        st[i]=(lazy[i]*pre[r-l])%hell;
        if(l!=r)
        {
            lazy[2*i+1]=lazy[i];
            lazy[2*i+2]=lazy[i];
        }
        lazy[i]=0;
    }
    if(qs>r||qe<l)
        return;
    if(qs<=l&&qe>=r)
    {
        st[i]=(v*pre[r-l])%hell;
        if(l!=r)
        {
            lazy[2*i+1]=v;
            lazy[2*i+2]=v;
        }
        lazy[i]=0;
        return;
    }
    int m=(l+r)/2;
    update(2*i+1,l,m,qs,qe,v);
    update(2*i+2,m+1,r,qs,qe,v);
    st[i]=((st[2*i+1]*pr[r-m])%hell+st[2*i+2])%hell;
}

void constructtree(int l,int r,int i)
{
    if(l==r)
    {
        st[i]=1;
        return;
    }
    int mid=(l+r)/2;
    constructtree(l,mid,2*i+1);
    constructtree(mid+1,r,2*i+2);
    st[i]=((st[2*i+1]*pr[r-mid])%hell+st[2*i+2])%hell;
}




void solve()
{
    int n;
    cin>>n;
    constructtree(0,n-1,0);
    int q;
    cin>>q;
    //cout<<st[0]<<endl;
    int x;
    int l,r;
    while(q--)
    {
        cin>>l>>r>>x;
        l--;r--;
        update(0,0,n-1,l,r,x);
        cout<<st[0]<<endl;
        
    }
    
}



int32_t main()
{
    
    IOS;
    pr[0]=1;
    pre[0]=1;
    for(int i=1;i<=N;i++)
    {pr[i]=(pr[i-1]*10)%hell;
        pre[i]=(pre[i-1]+pr[i])%hell;
    }
    int t;
    t=1;
    // cin>>t;
    while(t--)
    {
        
        solve();
    }
    return 0;
}




Measured memory_bytes: 14988