#include <bits/stdc++.h>   using namespace std;   long long dp[15][1 << 15];   int n, m, q;   struct NodeLCA {     int a, b, c;   };   vector<pair<int, int> > path;   vector<NodeLCA> LCA;   void readData() {     cin >> n >> m >> q;     for (int i = 0; i < m; i++) {       int u, v;       cin >> u >> v;       u--;       v--;       path.push_back(make_pair(u, v));     }     for (int i = 0; i < q; i++) {       int u, v, w;       cin >> u >> v >> w;       u--;       v--;       w--;       LCA.push_back({u, v, w});     }   }   int check(int root, int mask1, int child, int mask2) {     for (int i = 0; i < path.size(); i++) {       if (!(mask1 & (1 << path[i].first)) || !(mask1 & (1 << path[i].second)))         continue;       if (((mask2 & (1 << path[i].first)) > 0) ==           ((mask2 & (1 << path[i].second)) > 0))         continue;       if (path[i].second == root) swap(path[i].first, path[i].second);       if ((path[i].first != root) || (path[i].second != child)) return 0;     }     for (int i = 0; i < LCA.size(); i++) {       if (!(mask1 & (1 << LCA[i].a)) || !(mask1 & (1 << LCA[i].b))) continue;       if (((mask2 & (1 << LCA[i].a)) > 0) == ((mask2 & (1 << LCA[i].b)) > 0))         continue;       if (LCA[i].c != root) return 0;     }     return 1;   }   void dynamicProgramming() {     int mask, submask;     for (int i = 0; i < n; i++) dp[i][1 << i] = 1;     for (mask = 1; mask < (1 << n); mask++)       for (int i = 0; i < n; i++)         if (mask & (1 << i)) {           int tmp = -1;           for (int t = 0; t < n; t++)             if (t != i && (mask & (1 << t))) tmp = t;           if (tmp == -1) continue;           for (submask = (mask - 1) & mask; submask > 0;                submask = (submask - 1) & mask)             if ((submask & (1 << tmp)) && !(submask & (1 << i)))               for (int child = 0; child < n; child++)                 if (submask & (1 << child)) {                   if (check(i, mask, child, submask))                     dp[i][mask] += dp[child][submask] * dp[i][mask - submask];                 }         }   }   void writeData() { cout << dp[0][(1 << n) - 1]; }   int main() {     readData();     for (int i = 0; i < LCA.size(); i++)       if (LCA[i].a == LCA[i].b && LCA[i].a != LCA[i].c) {         cout << 0;         return 0;       }     dynamicProgramming();     writeData();     return 0;   }   