//EGOI 2023 Bikes vs Cars
//https://qoj.ac/contest/1354/problem/7157
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vll = vector<ll>;
const ll MAXN = 505;
vll uf(MAXN,-1);
ll ufind(ll v){
if(uf[v]<0) return v;
return uf[v]=ufind(uf[v]);
}
bool unite(ll v,ll u){
v=ufind(v); u=ufind(u);
if(v==u) return false;
if(uf[v]>uf[u]) swap(v,u);
uf[v]+=uf[u]; uf[u]=v; return true;
}
void mst(vector<array<ll,3>> edges,vector<array<ll,3>> &ans){
fill(uf.begin(),uf.end(),-1);
for(auto [w,v,u]:edges) if(unite(v,u)) ans.push_back({w,v,u});
}
int main(){
ll n, w, a;
cin >> n >> w;
vector<vll> A(n,vll(n)), B(n,vll(n)); vector<array<ll,3>> edges, ans;
for(int j=0; j<n; j++) for(int i=0; i<j; i++) cin >> a, A[i][j]=w-a;
for(int j=0; j<n; j++) for(int i=0; i<j; i++) cin >> B[i][j];
for(int j=0; j<n; j++) for(int i=0; i<j; i++) if(A[i][j]<=B[i][j]){
edges.push_back({A[i][j],i,j}); edges.push_back({B[i][j],i,j});
}
sort(edges.begin(),edges.end()); mst(edges,ans);
sort(edges.rbegin(),edges.rend()); mst(edges,ans);
vector<vll> A2(n,vll(n,1e18)), B2(n,vll(n,-1e18));
for(auto [w,v,u]:ans) A2[v][u]=A2[u][v]=min(A2[v][u],w), B2[v][u]=B2[u][v]=max(B2[v][u],w);
for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++){
A2[i][j]=min(A2[i][j],max(A2[i][k],A2[k][j]));
}
for(int k=0; k<n; k++) for(int i=0; i<n; i++) for(int j=0; j<n; j++){
B2[i][j]=max(B2[i][j],min(B2[i][k],B2[k][j]));
}
for(int j=0; j<n; j++) for(int i=0; i<j; i++){
if(A[i][j]!=A2[i][j] || B[i][j]!=B2[i][j]){cout << "NO\n"; return 0;}
}
cout << ans.size() << "\n";
for(auto [w,v,u]:ans) cout << v << " " << u << " " << w << endl;
}