思路是逆序进行并查集,哎它不是要求最大的最短边长,那么考虑每次加边是最长的边 是不是在第一次抵达某个联通快个数这个状态的时候,最短边就是最大的当前状态 然后在考虑它给的是l,r,事实上要最大,一定得选r处

/*
*/
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int ll
typedef  pair<int,int> pi ;
#define if1(x) for(int i =1 ;i<=x;i++)
#define if0(x) for(int i = 0;i<x;i++)
#define jf0(x) for(int j = 0;j<x;j++)
#define jf1(x) for(int j = 1;j<=x;j++)
#define pb push_back
const int mod = 1e9+7;
const int inf = 1e18;
const int N = 2e5+10;
int f[N];
int find(int u)
{
    if(f[u] ==u) return u;
    else return f[u] = find(f[u]);
}
void solve(){
    int m,n,q;
    cin>>n>>m>>q;
    if1(n) f[i] = i;
    vector<array<int,3> > edg;
    if0(m){
        int a,b,c;
        cin>>a>>b>>c;
        if(b!=a)
        edg.push_back({c,a,b});
    }
    sort(edg.rbegin(), edg.rend());
    vector<int> ans(n+1,inf);
    int now = n-1;
    if0(edg.size()){
        if(find(edg[i][2]) == find(edg[i][1])){
         f[find (edg[i][1]) ] = find(edg[i][2]);
          }
        else {
            ans[now] = edg[i][0];
            now--;
            f[find (edg[i][1]) ] = find(edg[i][2]);

        }
    }
    while(q--){
        int l,r;
        cin>>l>>r;
        if(ans[r] == inf) cout<<"NO ANSWER\n";
        else
        cout<<ans[r]<<endl;
    }

}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr); 
    int t=1;
    // cin>>t;
    while (t--)
    {
        solve();
    }
    
    return 0;
}
}