#include <iostream>
#include <vector>
using namespace std;
const int MX = 105;
int head[MX], tot, in[MX], c[MX], q[MX], ans;
int n, m;
struct node {
int v, w, nxt;
}e[10005];
void addEdge(int u, int v, int w){
e[++tot].v = v;
e[tot].w = w;
e[tot].nxt = head[u];
head[u] = tot;
in[v]++;
}
void toposort(){
int front = 1, rear = 0;
for(int i = 1; i <= n; i++)
if(c[i])
q[++rear] = i;
while(front <= rear) {
int u = q[front++];
for(int i = head[u]; i; i = e[i].nxt){
int v = e[i].v;
c[v] += e[i].w * c[u];
if(--in[v] == 0)
q[++rear] = v;
}
}
}
int main(int argc, char *argv[]) {
cin >> n >> m;
for(int i = 1; i <= n; i++) {
int U;
cin >> c[i] >> U;
if(!c[i]) c[i] = -U;
}
for(int i = 1; i <= m; i++) {
int u, v, w;
cin >> u >> v >> w;
addEdge(u, v, w);
}
toposort();
for(int i = 1; i <= n; i++)
if(!head[i])
cout << i << ' ' << c[i] << endl;
return 0;
}