#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
int to, next;
} edge[200009];
int cnt;
int head[200009];
void add(int u, int v)
{
edge[++cnt].to = v;
edge[cnt].next = head[u];
head[u] = cnt;
}
int n, m, k;
int c[3009][3009];
int mp[3009][3009][20];
int gg[3009][3009], cn[3009][3009];
int dis[3009][3009];
bool check(int a, int b, int c)
{
for (int i = 0; i < cn[a][b]; i++)
{
int k = mp[a][b][i];
if (k == c)
{
return 0;
}
}
return 1;
}
void print(int u)
{
vector<int> path;
cout << dis[u][n] << endl << "1 ";
int t1 = n, t2;
while (t1 != 1)
{
path.push_back(t1);
t2 = u;
u = gg[u][t1];
t1 = t2;
}
for (int i = path.size() - 1; i >= 0; i--)
{
int v = path[i];
cout << v << ' ';
}
}
void bfs(int sta)
{
for (int i = 0; i <= n; i++)
{
for (int j = 0; j <= n; j++)
{
dis[i][j] = 0x3f3f3f3f;
}
}
queue<pair<int, int>> q;
q.push(make_pair(0, sta));
dis[0][sta] = 0;
while (!q.empty())
{
int x = q.front().second;
int xx = q.front().first;
if (x == n)
{
print(xx);
exit(0);
}
q.pop();
for (int i = head[x]; i; i = edge[i].next)
{
int y = edge[i].to, w = 1;
if (dis[x][y] > dis[xx][x] + w && check(xx, x, y))
{
dis[x][y] = dis[xx][x] + 1;
q.push(make_pair(x, y));
gg[x][y] = xx;
}
}
}
}
signed main()
{
cin >> n >> m >> k;
for (int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
for (int i = 1; i <= k; i++)
{
int a, b, cc;
cin >> a >> b >> cc;
mp[a][b][++cn[a][b]] = cc;
}
bfs(1);
cout << -1;
return 0;
}