#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;
}
