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;
const bool print = false;
const int N = 57;
const long long mod = 1e9 + 7;
int nxt[600000], m, n, b[600000], a[600000], k, c[600000], r, cnt;
string s, t;
void get_nxt() {
  int i, j;
  j = nxt[0] = -1;
  i = 0;
  while (i < m) {
    if (j == -1 || t[i] == t[j]) {
      nxt[++i] = ++j;
    } else {
      j = nxt[j];
    }
  }
}
void kmp_count() {
  int tmp = 0;
  int j = 0;
  for (int i = 0; i < n; i++) {
    while (j > 0 && s[i] != t[j]) {
      j = nxt[j];
    }
    if (s[i] == t[j]) {
      j++;
    }
    while (j > k) {
      j = nxt[j];
    }
    b[i] = j;
    if (j == m) {
      j = nxt[j];
    }
  }
}
int main() {
  cin >> n >> m >> k;
  cin >> s >> t;
  get_nxt();
  kmp_count();
  for (int i = 0; i < n; i++) {
    a[i] = b[i];
  }
  reverse((s).begin(), (s).end());
  reverse((t).begin(), (t).end());
  get_nxt();
  kmp_count();
  for (int i = 1; i <= k; i++) {
    if (a[i] >= m || b[i] >= m) {
      cout << "Yes\n";
      cout << 1 << ' ' << n - k + 1 << endl;
      return 0;
    }
  }
  cnt = 0;
  for (int i = n - k; i >= k; i--) {
    c[b[n - i - 1]] = i + 1;
    r = a[i - 1];
    while (!c[m - r] && r && cnt < 50000000) {
      r = nxt[r];
      cnt++;
    }
    if (c[m - r]) {
      cout << "Yes\n";
      cout << i - k + 1 << ' ' << c[m - r] << endl;
      return 0;
    }
  }
  cout << "No\n";
  return 0;
}
