#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
typedef pair<int,int> pii;
const int mx = 505;
#define INF 1000000000
int N, W, M=0;
int A[mx][mx], B[mx][mx];
vector<vector<pii>> g(mx);
vector<pair<pii,int>> ans;
int fmx[mx][mx];
int fmn[mx][mx];
int main() {
cin>>N>>W;
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(i == j) {
fmn[i][j] = 0;
fmx[i][j] = INF;
}
else {
fmn[i][j] = INF;
fmx[i][j] = 0;
}
}
}
for(int j=1; j<N; j++)
for(int i=0; i<j; i++) {
int k;
cin>>k;
A[i][j] = W-k;
}
bool flag = false;
for(int j=1; j<N; j++)
for(int i=0; i<j; i++) {
cin>>B[i][j];
if(B[i][j] >= A[i][j]) {
fmx[i][j] = fmx[j][i] = max(A[i][j], B[i][j]);
fmn[i][j] = fmn[j][i] = min(A[i][j], B[i][j]);
ans.push_back({{i, j}, A[i][j]});
ans.push_back({{i, j}, B[i][j]});
// g[i].push_back({j, A[i][j]});
// g[j].push_back({i, A[i][j]});
// g[i].push_back({j, B[i][j]});
// g[j].push_back({i, B[i][j]});
}
// else {
// flag = true;
// }
}
// if(flag) {cout<<"NO"; return 0;}
for(int k=0; k<N; k++) {
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
fmx[i][j] = max(fmx[i][j], min(fmx[i][k], fmx[k][j]));
fmn[i][j] = min(fmn[i][j], max(fmn[i][k], fmn[k][j]));
}
}
}
for(int j=1; j<N; j++) {
for(int i=0; i<j; i++) {
if(fmx[i][j] != B[i][j]) {cout<<"NO"; return 0;}
if(fmn[i][j] != A[i][j]) {cout<<"NO"; return 0;}
}
}
cout<<ans.size()<<'\n';
for(auto [p, w]:ans) {
cout<<p.first<<' '<<p.second<<' '<<w<<'\n';
}
}