#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
const int inf = numeric_limits<int>::max() / 2;
const long double eps = 1e-9;
const long double pi = acosl(-1);
template <typename T>
inline bool mineq(T& a, T b) {
  return (a > b) ? (a = b, 1) : 0;
}
template <typename T>
inline bool maxeq(T& a, T b) {
  return (a < b) ? (a = b, 1) : 0;
}
inline void solve(), read();
const string file = "";
signed main() {
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  read();
  solve();
  return 0;
}
const int MAXN = 13;
const int MAXT = 1 << MAXN;
int n, m, q;
pair<int, int> es[100];
int as[100], bs[100], cs[100];
long long dp[MAXN][MAXT];
long long rec(int root, int mask) {
  if (mask == 0) {
    return 1;
  }
  if (dp[root][mask] != -1) {
    return dp[root][mask];
  }
  long long& ans = dp[root][mask];
  ans = 0;
  int last = -1;
  for (int i = 0; i < n; i++) {
    if (bool(mask & (1 << i))) {
      last = i;
    }
  }
  for (int nroot = 0; nroot <= last; nroot++) {
    for (int cur = mask; cur >= (1 << last); cur = mask & (cur - 1)) {
      if (!bool(cur & (1 << nroot))) {
        continue;
      }
      int which = cur - (1 << nroot);
      int other = mask - cur;
      int ok = 1;
      for (int i = 0; i < q; i++) {
        int a = as[i], b = bs[i], c = cs[i];
        if (bool(cur & (1 << a)) && bool(other + (1 << root) & (1 << b)) &&
            c != root) {
          ok = 0;
        }
        if (bool(cur & (1 << b)) && bool(other + (1 << root) & (1 << a)) &&
            c != root) {
          ok = 0;
        }
      }
      for (int i = 0; i < m; i++) {
        int a = es[i].first, b = es[i].second;
        if (bool(which & (1 << a)) && b == root) {
          ok = 0;
        }
        if (bool(which & (1 << b)) && a == root) {
          ok = 0;
        }
        if (bool(which + (1 << nroot) & (1 << a)) && bool(other & (1 << b))) {
          ok = 0;
        }
        if (bool(which + (1 << nroot) & (1 << b)) && bool(other & (1 << a))) {
          ok = 0;
        }
      }
      ans += ok * rec(nroot, which) * rec(root, other);
    }
  }
  return ans;
}
inline void solve() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < (1 << n); j++) {
      dp[i][j] = -1;
    }
  }
  long long ans = rec(0, (1 << n) - 1 - 1);
  cout << ans << "\n";
}
inline void read() {
  cin >> n >> m >> q;
  for (int i = 0; i < m; i++) {
    cin >> es[i].first >> es[i].second;
    --es[i].first, --es[i].second;
  }
  for (int i = 0; i < q; i++) {
    cin >> as[i] >> bs[i] >> cs[i];
    --as[i], --bs[i], --cs[i];
    if (as[i] == bs[i] && as[i] != cs[i]) {
      cout << 0 << "\n";
      exit(0);
    }
  }
}
