// #pragma GCC optimize("O3,unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")
#include <bits/allocator.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx,avx2,popcnt,lzcnt")
#include <bits/stdc++.h>
using namespace std;
// #define int long long
#define ll long long
#define vec vector
#define PB push_back
#define all(x) x.begin(), x.end()
#define F first
#define S second
#define ull unsigned long long
#define pii pair<int, int>
#define rz resize
#define ld long double
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define matrix vec<vec<int>>
#define MP make_pair
const int N = 2*(3e4+5);
const int MAXN=1e6+2;
const ll inf = 1e18;
const ll mod = 1000000007;
int add(int a, int b){ a+=b;if(a>=mod)a-=mod;return a; }
int mul(int a, int b){ a*=b;if(a>=mod)a%=mod;return a; }
int sub(int a, int b){ a-=b;if(a<0)a+=mod;return a; }
vec<pii>gr[N];
int tin[N];
pii par[N];
int n,k;
int A[N],B[N],S[N];
bool in_cycle[N];
int tplt=0,numdfs=0;
vec<pii>cycle;
void dfs(int u, int p=0){
tin[u]=++numdfs;
for(pii& v: gr[u])if(v.S!=p){
if(!tin[v.F])par[v.F]={u,v.S},dfs(v.F,v.S);
else if(tin[v.F] < tin[u]) {
cycle={{v.F,v.S}};
in_cycle[v.F]=1;
int t=u;
while(t!=v.F){
in_cycle[t]=1;
cycle.PB({t,par[t].S});
t=par[t].F;
}
}
}
}
void dfs_tree(int u, int val, int p=0){
if(u <= n)A[tplt]+=val,B[tplt]+=val;
for(pii v: gr[u])if(v.F!=p)dfs_tree(v.F,S[v.S],u);
}
void process_cycle(){
for(pii i: cycle){
int u=i.F;
for(pii v: gr[u])if(!in_cycle[v.F])dfs_tree(v.F,S[v.S],u);
}
int len=cycle.size();
for(int i=0;i<len;++i){
int val=S[cycle[i].S];
int u=cycle[i].F,v=cycle[(i+1)%len].F;
// cout<<cycle[i].S<<' '<<S[cycle[i].S]<<'\n';
if(u <= n)B[tplt]+=val;
if(v <= n)A[tplt]+=val;
}
}
const int M = 10*N;
int f[M];
signed main() {
ios::sync_with_stdio(0);cin.tie(0);
// freopen("Toll.INP","r",stdin);
// freopen("Toll.out","w",stdout);
cin>>n>>k;
int tot=0;
for(int i=1;i<=2*n;++i){
int u,v;cin>>u>>v>>S[i];gr[u].PB({n+v,i});gr[n+v].PB({u,i});
// cout<<u<<' '<<n+v<<' '<<s<<'\n';
tot+=S[i];
}
// for(int i=1;i<=n+n;++i){
// for(pii v: gr[i])cout<<i<<' '<<v.F<<'\n';
// cout<<"\n\n";
// }
for(int i=1;i<=n+n;++i)if(!tin[i]){
++tplt;
dfs(i);
process_cycle();
}
bitset<M>dp;
int base=0;
for(int i=1;i<=tplt;++i)base+=min(A[i],B[i]),f[abs(A[i]-B[i])]++;
int idx_C=0;
dp[0]=1;
for(int i=1;i<M;++i)if(f[i]){
int p=1;
while(f[i]>=p){
// idx_C[++idx_C]=i*p;
dp|=(dp << (i*p));
f[i]-=p;p<<=1;
}
if(f[i]>0)dp|=(dp << (i*f[i])),f[i]=0;
}
// for(int i=1;i<=idx_C;++i)dp=(dp | (dp<<C[i]));
bool ok=0;
for(int i=base;i<=tot;++i)if(dp[i-base] && abs(2*i - tot) <= k){ok=1;break;}
if(ok)yes;
else no;
cerr<<"ok\n";
return 0;
}