func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   inline bool chkmin(T &x, T y) {     return y < x ? x = y, 1 : 0;   }   template <typename T>   inline bool chkmax(T &x, T y) {     return x < y ? x = y, 1 : 0;   }   const int INF = 0x3f3f3f3f;   const int N = 1e2 + 10, Node = 2e3 + 10, Edge = Node * Node / 2;   int Dis[N][N], p[Node], a[Node], f[Node];   int to[Edge], nex[Edge], beg[Node], flow[Edge], dis[Node], cur[Node];   int S, T, e = 1;   inline int read() {     int x = 0, flag = 1;     char ch = getchar();     while (!isdigit(ch) && ch !=  - ) ch = getchar();     if (ch ==  - ) flag = -1, ch = getchar();     while (isdigit(ch)) x = (x << 3) + (x << 1) + (ch -  0 ), ch = getchar();     return x * flag;   }   inline void add(int x, int y, int z) {     to[++e] = y, nex[e] = beg[x], beg[x] = e, flow[e] = z;     to[++e] = x, nex[e] = beg[y], beg[y] = e, flow[e] = 0;   }   inline bool bfs() {     queue<int> q;     memset(dis, 0, sizeof(dis));     dis[S] = 1;     q.push(S);     while (!q.empty()) {       int x = q.front();       q.pop();       for (int i = beg[x]; i; i = nex[i])         if (flow[i] && !dis[to[i]]) dis[to[i]] = dis[x] + 1, q.push(to[i]);     }     return dis[T];   }   inline int dfs(int x, int f) {     if (x == T) return f;     int res = f;     for (int &i = cur[x]; i; i = nex[i])       if (flow[i] && dis[to[i]] == dis[x] + 1) {         int v = dfs(to[i], min(f, flow[i]));         flow[i] -= v, flow[i ^ 1] += v, f -= v;         if (!f) return res;       }     return res - f;   }   int main() {     int n = read(), m = read();     memset(dis, 63, sizeof(dis));     for (int i = (1), iend = (m); i <= iend; i++) {       int u = read(), v = read();       Dis[u][v] = Dis[v][u] = 1;     }     for (int i = (1), iend = (n); i <= iend; i++) Dis[i][i] = 0;     for (int k = (1), kend = (n); k <= kend; k++)       for (int i = (1), iend = (n); i <= iend; i++)         for (int j = (1), jend = (n); j <= jend; j++)           chkmin(Dis[i][j], Dis[i][k] + Dis[k][j]);     int A = read(), B = read(), k = read(), h = read();     S = A + B + 1, T = A + B + 2;     for (int i = (1), iend = (A); i <= iend; i++)       p[i] = read(), a[i] = read(), f[i] = read(), add(S, i, 1);     for (int i = (1), iend = (B); i <= iend; i++) {       add(i + A, T, 1);       int x = read(), d = read();       for (int j = (1), jend = (A); j <= jend; j++)         if (Dis[p[j]][x] <= f[j] && a[j] >= d) add(j, i + A, 1);     }     int ans = 0;     while (bfs()) {       memcpy(cur, beg, sizeof(cur));       ans += dfs(S, 1e9);     }     long long Ans = 1e18;     for (int i = (0), iend = (A); i <= iend; i++)       chkmin(Ans, 1ll * k * min(A - i, ans) + 1ll * i * h);     printf( %lld n , Ans);     return 0;   }   