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;
string str, pat;
int lps[500010], n, m, k;
void make_lps(string pattern) {
  int n = pattern.size();
  lps[0] = lps[1] = 0;
  for (int i = 2; i <= n; i++) {
    int p = lps[i - 1];
    while (true) {
      if (pattern[i - 1] == pattern[p]) {
        lps[i] = p + 1;
        break;
      }
      if (p == 0)
        break;
      else
        p = lps[p];
    }
  }
}
int milse[500010], preMsuf[500010], shadow[2][500010], ok;
void kmpFunction(string text, string pattern) {
  memset(lps, 0, sizeof(lps));
  int n = text.size(), m = pattern.size();
  make_lps(pattern);
  int p = 0, i = 0;
  while (true) {
    if (i == n) break;
    if (p < pattern.size() && text[i] == pattern[p]) {
      if (!shadow[ok][p + 1] && i + 1 >= k) {
        shadow[ok][p + 1] = i + 1;
      }
      milse[i] = p + 1;
      p++;
      i++;
    } else {
      if (p == 0) {
        milse[i] = 0;
        i++;
      } else
        p = lps[p];
    }
  }
  for (int i = m; i >= 1; i--) {
    p = lps[i];
    if (!shadow[ok][p] && shadow[ok][i])
      shadow[ok][p] = shadow[ok][i];
    else if (shadow[ok][i])
      shadow[ok][p] = min(shadow[ok][p], shadow[ok][i]);
  }
  return;
}
int main() {
  int x, y, z;
  cin >> n >> m >> k;
  cin >> str >> pat;
  kmpFunction(str, pat);
  for (int i = 0; i <= n - 1; i++) {
    if (milse[i] == m && milse[i] <= k) {
      x = max(0, i - k + 1);
      y = x + k;
      x++;
      y++;
      if (y + k - 1 <= n) {
        cout << "Yes\n" << x << ' ' << y << endl;
        return 0;
      }
      x = max(0, (i - milse[i]) + 1);
      z = (n - x);
      if (z < k) x -= (k - z);
      y = 0;
      x++;
      y++;
      if (x + k - 1 <= n && y + k <= x) {
        cout << "Yes\n" << y << ' ' << x << endl;
        return 0;
      }
    }
  }
  ok = 1;
  reverse(str.begin(), str.end());
  reverse(pat.begin(), pat.end());
  kmpFunction(str, pat);
  for (int i = 0; i <= m; i++)
    if (shadow[1][i]) shadow[1][i] = (n - shadow[1][i]) + 1;
  shadow[0][0] = k;
  shadow[1][0] = n - k + 1;
  for (int i = 0; i <= m; i++) {
    x = shadow[0][i];
    y = shadow[1][m - i];
    if (x && y && x < y && max(i, m - i) <= k) {
      cout << "Yes\n" << x - k + 1 << ' ' << y << endl;
      return 0;
    }
  }
  cout << "No" << endl;
  return 0;
}
