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