#include <bits/stdc++.h>   using namespace std;   const int MAX_N = 11111, MAX_M = 222222;   class Flow_Algorithm {    public:     int g[MAX_M], nxt[MAX_M], flow[MAX_M], c[MAX_N], h[MAX_N], nm;     int d[MAX_N], q[MAX_N];     int S, T;     void addedge(int x, int y, int w) {       g[nm] = y;       nxt[nm] = c[x];       c[x] = nm;       flow[nm] = w;       nm++;     }     void add(int x, int y, int w) {       addedge(x, y, w);       addedge(y, x, 0);     }     bool bfs() {       memset(d, -1, sizeof d);       d[q[1] = S] = 0;       for (int l = 1, r = 1; l <= r; ++l) {         int i = q[l];         for (int k = c[i]; ~k; k = nxt[k]) {           int j = g[k];           if (!~d[j] && flow[k]) d[q[++r] = j] = d[i] + 1;         }       }       return d[T] != -1;     }     int dfs(int i, int now) {       if (!now) return 0;       if (i == T) return now;       int w = 0;       for (int &k = c[i]; ~k; k = nxt[k]) {         int j = g[k];         if (d[j] == d[i] + 1) {           int res;           if (flow[k] && ((res = dfs(j, min(now - w, flow[k]))) > 0)) {             flow[k] -= res;             flow[k ^ 1] += res;             w += res;             if (w == now) return w;           }         }       }       return w;     }     void sets(int _S, int _T) {       S = _S;       T = _T;       nm = 0;       memset(c, -1, sizeof c);     }     int Dinic() {       memcpy(h, c, sizeof h);       int ans = 0;       while (bfs()) {         ans += dfs(S, 1000000000);         memcpy(c, h, sizeof c);       }       return ans;     }   } G;   int A[55], B[55], C[55], L[55], R[55];   int n, m;   int nd[55][222];   int calc(int i, int x) { return x * x * A[i] + x * B[i] + C[i]; }   int main() {     scanf( %d%d , &n, &m);     for (int i = (1); i <= (n); ++i) scanf( %d%d%d , &A[i], &B[i], &C[i]);     for (int i = (1); i <= (n); ++i) scanf( %d%d , &L[i], &R[i]);     int tot = 0;     for (int i = (1); i <= (n); ++i)       for (int j = (L[i] - 1); j <= (R[i]); ++j) nd[i][j + 100] = ++tot;     int S = tot + 1, T = tot + 2;     G.sets(S, T);     for (int i = (1); i <= (n); ++i) {       G.add(S, nd[i][L[i] - 1 + 100], 1000000000);       for (int j = (L[i]); j <= (R[i]); ++j)         G.add(nd[i][j - 1 + 100], nd[i][j + 100], 20000000 - calc(i, j));       G.add(nd[i][R[i] + 100], T, 1000000000);     }     for (int i = (1); i <= (m); ++i) {       int u, v, d;       scanf( %d%d%d , &u, &v, &d);       for (int j = (L[u] - 1); j <= (R[u]); ++j) {         int p = j - d, pt = 0;         if (p < L[v])           pt = nd[v][L[v] - 1 + 100];         else           pt = nd[v][p + 100];         G.add(nd[u][j + 100], pt, 1000000000);       }     }     int ans = G.Dinic();     ans = n * 20000000 - ans;     printf( %d n , ans);   }   