// pD
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define pii pair<LL, LL>
#define S second
#define F first
const int maxn = 1000+10;
int n, w;
int b[maxn][maxn];
int c[maxn][maxn];
vector< tuple<int, int, int> > cc, bb;
vector< tuple<int, int, int> > v;
int parent[maxn];
int sc[maxn][maxn], sb[maxn][maxn];
void init(int n){
for(int i=0; i<=n; i++){
parent[i]=i;
}
}
int leader(int x){
if(parent[x]!=x) return parent[x]=leader(parent[x]);
return x;
}
bool merge(int x, int y){
x=leader(x);
y=leader(y);
if(x==y) return 0;
parent[x]=y;
return 1;
}
signed main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin>>n>>w;
for(int i=1; i<n; i++)
for(int j=0; j<i; j++) cin>>c[i][j];
for(int i=1; i<n; i++)
for(int j=0; j<i; j++) cin>>b[i][j];
for(int i=1; i<n; i++)
for(int j=0; j<i; j++){
if(b[i][j] + c[i][j] < w) continue;
bb.push_back( make_tuple(-b[i][j], i, j) );
cc.push_back( make_tuple(-c[i][j], i, j) );
}
sort(cc.begin(), cc.end());
sort(bb.begin(), bb.end());
init(n);
memset(sc, -1, sizeof(sc) );
for(int i=0; i<cc.size(); i++){
auto[val, x, y] = cc[i];
if(merge(x, y)){
sc[x][y]=sc[y][x]=-val;
v.push_back( make_tuple(x, y, w-(-val)) );
}
}
init(n);
memset(sb, -1, sizeof(sc) );
for(int i=0; i<bb.size(); i++){
auto[val, x, y] = bb[i];
if(merge(x, y)){
sb[x][y]=sb[y][x]=-val;
v.push_back( make_tuple(x, y, -val) );
}
}
for(int k=0; k<n; k++)
for(int i=0; i<n; i++)
for(int j=0; j<n; j++){
sc[i][j]=sc[j][i]=max(sc[i][j], min(sc[i][k], sc[k][j]));
sb[i][j]=sb[j][i]=max(sb[i][j], min(sb[i][k], sb[k][j]));
}
for(int i=0; i<n; i++)
for(int j=0; j<i; j++)
if(sb[i][j] != b[i][j] or sc[i][j] != c[i][j]){
cout<<"NO";
return 0;
}
cout<<v.size()<<"\n";
for(auto[x, y, val]: v) cout<<x<<" "<<y<<" "<<val<<"\n";
return 0;
}