#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cassert>
#include <algorithm>
#include <array>
#include <vector>
#define docmp(at) if(a.at!=b.at) return a.at<b.at;
using namespace std;
using ll=long long;
using pii=pair<ll,ll>;
using Info=pii;
constexpr int N=2e5+7,P{998244353};
int n,m;
inline void upd(auto &a,const pii &b){
if(b.first>a.first) a=b;
else if(b.first==a.first) a.second=(a.second+b.second)%P;
}
struct F{
array<pii,N> s;
static inline int l(int x){return x&-x;}
inline void add(int x,const pii v){
for(;x<=n;x+=l(x)){
upd(s[x],v);
}
}
inline pii query(int x){
pii t{0,0};
for(;x;x^=l(x)){
upd(t,s[x]);
}
return t;
}
inline void erase(int x){
for(;x<=n;x+=l(x)){
s[x]=make_pair(0,0);
}
}
}tr;
struct Q{
int a,b,c,d,i,v;
bool lft;
};
array<struct Q,N> a;
array<pii,N> f;
inline void disc(){
static int d[N];
int dc{0};
#define discat(at) dc=0;for(int i{1};i<=n;++i)d[++dc]=a[i].at;dc=unique(d+1,d+dc+1)-d-1;for(int i{1};i<=n;++i)a[i].at=lower_bound(d+1,d+dc+1,a[i].at)-d;
discat(a);
discat(b);
discat(c);
discat(d);
}
inline bool cmpa(const Q &a,const Q &b){
docmp(a);docmp(b);docmp(c);docmp(d);return false;
}
inline bool cmpb(const Q &a,const Q &b){
docmp(b);docmp(c);docmp(d);docmp(a);return false;
}
inline bool cmpc(const Q &a,const Q &b){
docmp(c);docmp(d);docmp(a);docmp(b);return false;
}
inline bool cmpd(const Q &a,const Q &b){
docmp(d);docmp(a);docmp(b);docmp(c);return false;
}
inline void solve1(int l,int r){
static array<Q,N> tmp;
if(l==r) return;
int m{(l+r)>>1};
memcpy(tmp.begin()+l,a.begin()+l,(r-l+1)*sizeof(Q));
solve1(l,m);
sort(a.begin()+l,a.begin()+m+1,cmpc),
sort(a.begin()+m+1,a.begin()+r+1,cmpc);
int pl{l},pr{m+1};
for(pr=m+1;pr<=r;++pr){
if(a[pr].lft) continue;
while(pl<=m&&a[pl].b<=a[pr].b){
if(a[pl].lft) tr.add(a[pl].d,f[a[pl].i]);
++pl;
}
auto rs=tr.query(a[pr].d);
rs.first+=1LL*a[pr].v;
upd(f[a[pr].i],rs);
}
for(int i{l};i<pl;++i)
if(a[i].lft) tr.erase(a[i].d);
memcpy(a.begin()+l,tmp.begin()+l,(r-l+1)*sizeof(Q));
solve1(m+1,r);
}
inline void solve2(int l,int r){
static array<Q,N> tmp;
if(l==r) return;
int m{(l+r)>>1};
memcpy(begin(tmp)+l,begin(a)+l,(r-l+1)*sizeof(Q));
solve2(l,m);
for(int i{l};i<=m;++i) a[i].lft=true;
sort(begin(a)+l,begin(a)+r+1,cmpb);
solve1(l,r);
memcpy(begin(a)+l,begin(tmp)+l,(r-l+1)*sizeof(Q));
solve2(m+1,r);
}
signed main(){
scanf("%d%d",&n,&m);
for(int i{1};i<=n;++i){
scanf("%d%d%d%d%d",&a[i].a,&a[i].b,&a[i].c,&a[i].d,&a[i].v);
}
disc();
sort(begin(a)+1,begin(a)+n+1,cmpa);
int nn{1};
for(int i{2};i<=n;++i){
if(a[i].a==a[nn].a&&a[i].b==a[nn].b&&a[i].c==a[nn].c&&a[i].d==a[nn].d){
a[i-1].v+=a[i].v;
}
else{
a[++nn]=a[i];
}
}n=nn;
for(int i{1};i<=n;++i){
a[i].i=i,a[i].lft=false;
f[i]=make_pair(1ll*a[i].v,1ll);
}
solve2(1,n);
Info ans{0,0};
for(int i{1};i<=n;++i) upd(ans,f[i]);
printf("%lld\n%lld\n",ans.first,ans.second);
return 0;
}