#include <bits/stdc++.h>   #pragma warning(disable : 4996)   using namespace std;   const long double EPS = 1e-9;   vector<vector<int>> g;   vector<vector<int>> hlca;   vector<vector<int>> lca;   vector<vector<long long>> dp;   int N;   int get_num_bit(int mask) {     int cnt = 0;     while (mask) {       cnt += mask & 1;       mask >>= 1;     }     return cnt;   }   long long f(int root, int mask) {     if (dp[root][mask] != -1) return dp[root][mask];     if (get_num_bit(mask) == 1) {       return dp[root][mask] = 1;     }     long long res = 0;     int osnmask = mask - (1 << root);     int nmask = osnmask;     while (nmask) {       int nmask1 = mask ^ nmask;       for (int nr = 0; nr < N; ++nr) {         if (!((1 << nr) & nmask)) continue;         bool good = true;         for (int a = 0; a < N; ++a) {           for (int b = a + 1; b < N; ++b) {             if (lca[a][b] == -1) continue;             if ((nmask & (1 << a)) && (nmask1 & (1 << b)) ||                 (nmask & (1 << b)) && (nmask1 & (1 << a))) {               if (lca[a][b] != root) {                 good = false;                 break;               }             } else if ((nmask & (1 << a)) && (nmask & (1 << b))) {               if (!(nmask & (1 << lca[a][b]))) {                 good = false;                 break;               }             } else if ((nmask1 & (1 << a)) && (nmask1 & (1 << b))) {               if (!(nmask1 & (1 << lca[a][b]))) {                 good = false;                 break;               }             }           }           if (!good) break;         }         if (!good) continue;         for (int i = 0; i < N; ++i) {           if (g[root][i] && (nmask & (1 << i)) && nr != i) {             good = false;             break;           }         }         if (!good) continue;         for (int i = 0; i < N; ++i) {           for (int j = 0; j < N; ++j) {             if (i == root || j == root) continue;             if (g[i][j] && (nmask & (1 << i)) && ((mask ^ nmask) & (1 << j))) {               good = false;               break;             }           }         }         if (good) {           long long a = f(nr, nmask);           long long b = f(root, mask ^ nmask);           res += a * b;         }       }       if (get_num_bit(nmask) == 1) break;       nmask = osnmask & (nmask - 1);     }     return dp[root][mask] = res;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     int n, m, q;     cin >> n >> m >> q;     N = n;     g.assign(n, vector<int>(n, 0));     dp.assign(n, vector<long long>((1 << n), -1));     lca.assign(n, vector<int>(n, -1));     hlca.resize(n);     for (int i = 0; i < m; ++i) {       int a, b;       cin >> a >> b;       --a;       --b;       g[a][b] = g[b][a] = 1;     }     for (int i = 0; i < q; ++i) {       int a, b, w;       cin >> a >> b >> w;       if (a == b && a != w) {         cout << 0;         return 0;       } else if (a == b)         continue;       --a;       --b;       --w;       if (a > b) swap(a, b);       hlca[a].push_back(w);       hlca[b].push_back(w);       if (lca[a][b] != -1 && lca[a][b] != w) {         cout << 0;         return 0;       }       lca[a][b] = w;     }     cout << f(0, (1 << n) - 1);     return 0;   };