#include <bits/stdc++.h>
using namespace std;
template <class T>
T sqr(T x) {
  return x * x;
}
const int maxn = 15;
long long f[maxn][1 << maxn][maxn];
int vis[maxn][1 << maxn][maxn];
vector<int> ban[maxn];
int lca[maxn], edge[maxn];
int n, m, x, y, z, c;
long long dp(int x, int state, int pre) {
  if (!state) return 1;
  if (vis[x][state][pre]) return f[x][state][pre];
  vis[x][state][pre] = 1;
  long long ans = 0;
  for (int substate = state; substate; substate = (substate - 1) & state) {
    bool flag = false;
    if (__builtin_popcount(substate & edge[x]) > 1) continue;
    for (int i = 0; i < ban[x].size(); i++)
      if ((ban[x][i] & substate) == ban[x][i]) {
        flag = true;
        break;
      }
    if (flag) continue;
    for (int i = pre + 1; i <= n - 1; i++) {
      if ((substate & (1 << i)) &&
          ((edge[i] & (substate | (1 << x))) == edge[i]) &&
          ((lca[i] & substate) == lca[i]) &&
          (((substate ^ (1 << i)) & edge[x]) == 0)) {
        ans =
            (ans + dp(i, substate ^ (1 << i), 0) * dp(x, state ^ substate, i));
      }
    }
  }
  f[x][state][pre] = ans;
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &c);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &x, &y);
    x--;
    y--;
    edge[x] |= (1 << y);
    edge[y] |= (1 << x);
  }
  for (int i = 1; i <= c; i++) {
    scanf("%d%d%d", &x, &y, &z);
    x--;
    y--;
    z--;
    ban[z].push_back((1 << x) | (1 << y));
    lca[z] |= (1 << x) | (1 << y);
  }
  cout << dp(0, (1 << n) - 2, 0) << endl;
}
