#include <cstdio>
#include <queue>
#include <deque>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define lld long long
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);
#define vec vector
const int N = 2e4+9;
using namespace std;
int n,din[N],dout[N],m;
int ddin[N],ddout[N];
struct node{
int v,val;
};
vec<node>e[N];
lld G[109][109];
lld a[N],U[N];
bool vis[N];
vec<int>tp;
void put(){
cin>>n>>m;
for(int i=1;i<=n;++i)
cin>>a[i]>>U[i],a[i]-=U[i];
for(int i=1;i<=m;++i){
int u,v,val;
cin>>u>>v>>val;
e[u].push_back({v,val});
G[u][v]=val;
din[v]++,dout[u]++;
}
for(int i=1;i<=n;++i){
ddin[i]=din[i];
ddout[i]=dout[i];
}
}
void topo(){
queue<int>q;
for(int i=1;i<=n;++i)
if(din[i]==0) q.push(i);
while(!q.empty()){
int head = q.front();
q.pop();
tp.push_back(head);
for(int j=0;j<e[head].size();++j){
int y = e[head][j].v;
if(--din[y]==0) q.push(y);
}
}
}
void dfs(){
for(int i=0 ; i<=tp.size()-1 ; ++i){
int u = tp[i];
for(int j=1 ; j<=n ; ++j){
if(G[u][j] != 0){
a[j] += G[u][j] * a[u];
}
}
}
for(int i=1 ; i<=n ; ++i){
if(a[i]>0 && ddin[i]!=0 && ddout[i]==0){
printf("%d %lld\n",i,a[i]);
}
}
}
int main(){
ios;
put();
topo();
dfs();
return 0;
}