Jenya has recently acquired quite a useful tool — k-scissors for cutting strings. They are generally used for cutting out two non-intersecting substrings of length k from an arbitrary string s (its length should be at least 2·k in order to perform this operation) and concatenating them afterwards (preserving the initial order). For example, with the help of 2-scissors you can cut ab and de out of abcde and concatenate them into abde, but not ab and bc since they're intersecting.

It's a nice idea to test this tool before using it in practice. After looking through the papers, Jenya came up with two strings s and t. His question is whether it is possible to apply his scissors to string s such that the resulting concatenation contains t as a substring?

Input

The first line contains three integers n, m, k (2 ≤ m ≤ 2·k ≤ n ≤ 5·105) — length of s, length of t and the aforementioned scissors' parameter correspondingly.

The next two lines feature s and t consisting of lowercase latin letters.

Output

If there is no answer, print «No». 

Otherwise print «Yes» and two integers L and R denoting the indexes where cutted substrings start (1-indexed). If there are several possible answers, output any.

Examples

Input

7 4 3
baabaab
aaaa


Output

Yes
1 5


Input

6 3 2
cbcbcb
bcc


Output

Yes
2 5


Input

7 5 3
aabbaaa
aaaaa


Output

No

Note

In the first sample case you can cut out two substrings starting at 1 and 5. The resulting string baaaab contains aaaa as a substring.

In the second sample case the resulting string is bccb.
#include <bits/stdc++.h>
using namespace std;
bool cmp(pair<int, int> i, pair<int, int> j) { return i.second > j.second; }
vector<int> f(string& s, string& t, int k) {
  int n = s.size() + t.size() + 1;
  string zs = t + '$' + s;
  vector<int> z(n, 0);
  for (int i = 1, l = 0, r = 0; i < n; i++) {
    if (i <= r) z[i] = min(r - i + 1, z[i - l]);
    while (i + z[i] < n && zs[z[i]] == zs[i + z[i]]) z[i]++;
    if (i + z[i] - 1 > r) {
      l = i;
      r = i + z[i] - 1;
    }
  }
  vector<pair<int, int> > pf;
  for (int i = 0; i < s.size(); i++) {
    pf.push_back({i, z[i + t.size() + 1]});
    if (z[i + t.size() + 1] >= t.size()) {
      int left = i, right = i + 2 * k - 1;
      if (right >= s.size()) {
        int d = right - s.size() + 1;
        left -= d;
        right -= d;
      }
      if (left >= 0) {
        cout << "Yes\n";
        cout << left + 1 << " " << left + k + 1 << "\n";
        exit(0);
      }
    }
  }
  sort(pf.begin(), pf.end(), cmp);
  vector<int> lpos(t.size() + 1, 0);
  lpos[0] = k - 1;
  set<int> good;
  int in = 0;
  for (int i = t.size(); i > 0; i--) {
    while (pf[in].second >= i) {
      good.insert(pf[in].first);
      in++;
    }
    auto it = good.lower_bound(k - i);
    if (it == good.end())
      lpos[i] = -1;
    else
      lpos[i] = *it;
  }
  return lpos;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m, k;
  cin >> n >> m >> k;
  string s, t;
  cin >> s >> t;
  vector<int> lpos = f(s, t, k);
  reverse(t.begin(), t.end());
  reverse(s.begin(), s.end());
  vector<int> rpos = f(s, t, k);
  for (int i = 0; i <= k; i++) {
    if (t.size() - i > k || lpos[i] == -1 || rpos[t.size() - i] == -1) continue;
    int mini = lpos[i] + i, maxi = n - rpos[t.size() - i] - (t.size() - i);
    if (mini <= maxi) {
      cout << "Yes\n";
      cout << lpos[i] - (k - i) + 1 << " " << maxi + 1 << "\n";
      return 0;
    }
  }
  cout << "No\n";
  return 0;
}
